2013-05-29 4 views
1

두 개의 CSV 파일이 있습니다. 하나는 긴 참조 번호 목록이고 다른 하나는 일일 주문 목록입니다.CSV 조작 AWK?

일일 기준으로 나는 & 붙여 넣기를 참조 번호에서 일일 주문으로 잘라야합니다. 분명히 주문과 동일한 수의 참조 번호 만 잘라 내기 때문에 예를 들어 20 개의 주문이있는 경우 다른 파일에서 20 개의 참조 번호를 가져와 내 주문 파일에 붙여 넣어야합니다. 우리는 다음 날에 중복을 얻지 않도록이 숫자를 자릅니다.

이 과정을 자동화하고 싶지만 가장 좋은 방법은 모르겠다. 나는 윈도우를 돌리고 다른 csv 조작을 위해 AWK를 사용해 왔지만, AWK에 대해서는 경험이별로 없으며 이것이 가능한지 확실하지 않기 때문에 아무나 최고의 솔루션에 대한 아이디어가 있는지 물어볼 뿐이다.

+0

파일의 압축을 제공 할 수 있습니까? – aymericbeaumet

+1

mvp가 좋은 대답을주었습니다. 운이 좋다면 awk에 모든 CSV 파싱 코드를 직접 작성해야합니다. Perl은 이미 CSV 라이브러리를 가지고 있으며 awk와 거의 유사하므로 사용자가 가지고있는 awk 기술이 대부분 번역해야합니다. 혼란 스러우면, awk를 perl로 변환하는 perl과 함께 제공되는 유틸리티 인 a2p를 사용하십시오. – JimR

+0

일부 샘플 입력 및 예상 출력 게시. 당신이하고 싶은 일은 awk에서 사소한 것 같지만, 의심 스럽다면 CSV 파일의 모든 스타일을 완전히 파싱해야합니다. http : //lorance.freeshell의 Stinsons CSV 파서를 다운로드하여 사용할 수 있습니다. .org/csv. –

답변

2

CSV를 올바르게 구문 분석하는 것은 매우 까다로운 작업입니다. 대부분의 어려움은 따옴표, 큰 따옴표, 쉼표, 공백 등을 파싱하는 실수로 발생합니다.

바퀴를 다시 발명하기보다는 잘 테스트 된 라이브러리를 사용하는 것이 좋습니다. 나는 awk이 하나 있다고 생각하지 않지만, Perl은 : DBD::CSV을한다.

Windows의 경우 간단히 ActivePerl을 설치하십시오. 기본적으로 이미 DBD::CSV이 설치되어 있습니다. 당신은 당신이 입력 CSV 파일이 언급 이후

use DBI; 
my $dbh = DBI->connect("dbi:CSV:f_ext=.csv") or die $DBI::errstr; 
my $sth = $dbh->prepare("SELECT * FROM mytable"); # access mytable.csv 
$sth->execute(); 
while (my @row = $sth->fetchrow_array()) { 
    print "id: $row[0], name: $row[1]\n"; 
} 
# you can also access columns by name, like this: 
# while (my $row = $sth->fetchrow_hashref()) { 
#  print "id: $row->{id}, name: $row->{name}\n"; 
# } 
$sth->finish(); 
$dbh->disconnect(); 

, 당신은 심지어 SQL을 사용할 수 있습니다 그리고

는 데이터를 검색하고 while 루프 내에서 다른 형식으로 변환하려면이 같은 펄 코드를 사용 두 테이블의 데이터를 한 번에 제대로 조인하는 명령문을 조인하십시오.

+0

대단히 감사합니다. – Paul