나는 csv 파일을 가지고 있고 Perl을 사용하여 파일에서 일치하는 열을 기반으로 파일을 더 작은 파일로 분할하고 싶습니다. 저는 Linux Rhel6에서 작업하고 있습니다.
예:
fruit1, fruit2,pricerate,quantity
orange, apple, 3,9
apple,lemon,8,1
orange, apple,3,8
pineapple,papaya,9,19
orange,apple,3,7
pineapple,papaya,9,10
출력은 다음과 유사합니다.
파일 1:
fruit1,fruit2,pricerate,quantity
orange,apple, 3,9
orange,apple,3,8
orange,apple,3,7
파일 2:
fruit1,fruit2,pricerate,quantity
pineapple,papaya,9,19
pineapple,papaya,9,10
일치하지 않는 항목은 별도의 파일로 이동됩니다. 파일 3을 말해보세요.
답변1
이 문제를 해결하는 한 가지 방법은 다음과 같습니다.
- 입력 파일 열기
- 입력 파일의 첫 번째 줄(제목)을 저장합니다.
입력 파일의 헤더 뒤의 각 줄에 대해 다음을 수행합니다.
- 처음 두 열 읽기
- 일치시키려는 필드에 대한 출력 파일을 아직 열지 않은 경우 새 출력 파일을 열고 해당 파일 핸들을 해시에 저장합니다. 또한 새 출력 파일에 헤더 행을 씁니다.
- 파일 핸들 해시에서 이 줄을 저장해야 하는 출력 파일의 핸들을 가져옵니다. 이 줄을 파일에 씁니다.
다음은 처음 두 필드와 일치하는 몇 가지 샘플 코드입니다.
#!/usr/bin/perl
use strict;
use warnings;
my %filehandles=();
my $filenum=1;
open INPUT, "fruit.csv"
or die "Cannot open input file.";
my $header = <INPUT>;
while ( <INPUT> )
{ # Remove spaces from input
$_ =~ s/ //g;
my @fields = split ',', $_;
if ( ! $filehandles{$fields[0]}{$fields[1]} )
{ open $filehandles{$fields[0]}{$fields[1]} , ">file$filenum"
or die "Cannot open output file file$filenum.";
print {$filehandles{$fields[0]}{$fields[1]}} $header;
$filenum++;
}
print {$filehandles{$fields[0]}{$fields[1]}} $_;
}