컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Previous Post [독서] 소설가 이문열 선생의, 습작기에 대한 새로운 말씀[QnA] 포토샵 파일의 기본 확장자는 무엇인가요? - Photoshop Filename ...[QnA] RSS, Atom 피드 구독할 수 있는 리더 사이트는? / Atom(아톰) 지원...[QnA] 사이트나 블로그의, RSS XML 등의 빨간 아이콘이나 기호는 무엇입니까?리눅스/Cygwin] 파일/디렉토리 지우는 명령어, 파일 삭제: rm[QnA] ipconfig 는, 내부 명령어입니까? 외부 명령입니까?[C언어 기초] return 이란? 함수인가요? return 0; 의 의미는?[C언어] C언어와 C++의 예약어 리스트; Keywords[배치 파일] 프로그램 실행의 성공 여부를 Error Level 로 확인/판단하기: ERR...[한글 맞춤법 QnA] '밖에' 는 붙여 쓰나요, 띄어 쓰나요? : 띄어쓰기

[Perl/펄] CSV / 간단한 목록 파일에서, 몇 번째 필드(Field)만 추출하기 [오피스/엑셀]

Monday, July 17, 2006

텍스트 파일에 이런 간단한 데이타베이스를 만들어 쓰는 경우가 흔히 있습니다.
Number,Name
53350000053,물감자
6463737377754,똘똘이
535311626,레몬향기혜성
26262664264,맹구
6426464642,노가리
626264,강호동
64226422,봉천동
6868573,별사탕
464262642,이효리
8537727224,땡칠이
53653673513,백반형님

이것은 쉼표로 필드를 구분하는 CSV 파일 형식입니다. 다음의 예제를 실행하기 위해서는 이 목록을 0.csv 등의 이름으로 하드에 저장합니다.


#!/usr/bin/perl
use strict; use warnings;

my $n = 0;                    # 첫 번째 필드는 0, 두 번째 필드는 1
my $separator = ",";          # 분리 기호 정의


  foreach (<>) {              # 옵션으로 지정한 텍스트 파일을 읽어서 한 줄씩 처리
    next if $_ =~ /^\s+$/;    # 빈줄이면 파일의 다음 행으로 그냥 통과
    @_ = split /$separator/;  # 분리자를 기준으로 문장을 분리하여 배열에 넣기
    chomp @_;                 # 요소들 끝의 행갈이 문자 제거
    print $_[$n], "\n" if defined $_[$n];    # n번째 요소 출력, n번째 요소가 존재할 때에만
  }

이 소스를 0.pl 등의 이름으로 저장하고
0.pl 0.csv
이렇게 실행시키면 (컴파일할 필요없고 그냥 배치 파일처럼 실행시키면 됨)

D:\Z>0.pl 0.csv
Number
53350000053
6463737377754
535311626
26262664264
6426464642
626264
64226422
6868573
464262642
8537727224
53653673513

D:\Z>


이렇게 첫 번째 필드만 추출됩니다. 이것을 out.txt 라는 파일로 저장하기 위해서는
0.pl 0.csv > out.txt
이렇게 재지향(Redirection)을 사용하면 됩니다.

만약 파일명을 지정하지 않고 그냥 0.pl 이렇게 실행시키면, 화면에 아무 글자도 나오지 않고 엔터키를 치면 커서만 아래로 내려가는 상태가 됩니다. 이것은 펄의 <> 연산자가 키보드로부터 직접 입력을 받기 위해 대기하는 상태입니다. 버그는 아닙니다. 이때는 Ctrl+C 로 빠져나온 후, 파일명까지 입력하여 다시 실행시켜 주면 됩니다.


소스에서
my $n = 0;

my $n = 1;
로 고쳐주면 두 번째 필드가 이렇게 추출됩니다:
D:\Z>0.pl 0.csv
Name
물감자
똘똘이
레몬향기혜성
맹구
노가리
강호동
봉천동
별사탕
이효리
땡칠이
백반형님

D:\Z>





※ 엑셀 문서인 xls 파일은 이진파일이라서 호환성이 낮기 때문에, CSV(쉼표로 분리; Comma-separated Values) 라는 텍스트 파일로 저장하여 배포하는 경우가 많습니다. 이러면 엑셀을 설치하지 않은 사람이나, xls 파일을 직접 인식하지 못하는 다른 프로그램들도 그 데이터를 읽을 수 있게 됩니다.

※ 이것은 간단한 CSV 파일을 다루는 예제일 뿐이고, 복잡한 CSV 파일을 본격적으로 다루기 위해서는 CPAN 에 가서 Text::CSV 라는 모듈을 받아서 설치해야 합니다. Text::CSV 는 펄의 내장 모듈이 아닙니다.

※ 데이터 자체에 쉼표나 쌍따옴표가 들어가 있으면 처리하지 못하는 한계가 있습니다. 그런 기호가 들어간다면 Text::CSV 모듈을 사용해야 합니다.

※ 이 예제를 실무에 사용하기 위해서는 테스트 과정이 필요합니다. 제가 찾지 못한 버그가 나타날 수 있습니다.

※ 윈도우에서도 액티브펄(ActivePerl)을 설치하면 펄을 사용할 수 있습니다. 액티브펄(ActivePerl)은 파이어폭스처럼 오픈소스입니다. 회사에서도 무료로 사용할 수 있습니다.





업데이트 포스트:
▶▶ [Perl/펄] 탭으로 분리된 CSV 파일에서 특정 필드만 추출: getField.pl



더 읽기:

☞ Perl

☞ 오피스

0 Comments:

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Categories
Previous Posts
Monthly Archives
Top