Perl을 사용하여 파일 분할

Perl을 사용하여 파일 분할

나는 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]}} $_;
}

관련 정보