2016-10-12 3 views
1

그래서 여러 개의 열과 행 (각각 6000 개의 홀수 행과 +60 열씩)이있는 여러 개의 큰 CSV 파일이 있으므로 별도의 CSV 파일로 분할하고 싶습니다. 예를 들면 각 파일의 첫 번째 열의 첫 번째 행에 표시되는 문자열을 명명 될 주어진 문자열에서 (문자열 사이 상이 라인 수) ... :Perl : 지정된 문자열에서 CSV를 분할하고 특정 문자열을 파일 이름으로 사용

Peter B1 C1 D1 
A2  B2 C2 D2 
A3  B3 C3 D3 
END B4 C4 D4 
Jack B5 C5 D5 
A6  B6 C6 D6 
A7  B7 C7 D7 
END B8 C8 D8 
Billy B9 C9 D9 
A10 B10 C10 D10 
A11 B11 C11 D11 
END B12 C12 D12 

그래서이 있어야 3 Peter, Jack 및 Billy라는 파일에이 파일에 대해 쓰여질 마지막 행임을 알리는 END 단어가 있습니다. Peter는 범위 A1 (Peter라는 단어 포함)을 D4에 포함합니다. 잭 A5에서 D8, 빌리 A9에서 D12.

use strict; 
use warnings; 

### INPUT 
my $split_woord = 'END';  #word that signals file to be split 
print "Input file: "; 
my $file_name = <STDIN>; 

my $input_file = "file locataion/$file_name.csv"; 

### OPEN 
open (INPUT, ">", "$input_file") or die "Can't open $file_name: $!\n"; 

my $name= undef; 

while (<INPUT>){ 

    my $line = $_; 

    my ($a,$b,$c,$d)=split('\,', $line); 

    until ($a eq $split_word){  #loop until column 1 reads 'END', then restart 
    $name eq $a;     #want to indictae first line 

    my $output_file = "file_location/$name.csv"; 
    open (OUTPUT, ">>", "$output_file") or die "Can't create $output_file: $!\n"; 

    print OUTPUT "$a,$b,$c,$d\n"; 
    next; 

    } 

} 

exit; 

내가 제대로 루프에 그것을 얻을 수없는 것, 또한 파일의 이름으로 행동하는 첫 번째 열/행을 사용하는 고군분투 :

지금까지이있다. 어떤 도움이라도 대단히 감사하게 될 것입니다 !!! 모든 TIA

+0

'csplit'는 쉘 명령입니다. 해봤 어 ?? – Ashish

+0

또한 기타 문의 사항을 확인하십시오. http://stackoverflow.com/questions/8272017/split-files-based-on-file-content-and-pattern-matching – Ashish

+1

여기에 과제를 수행하겠습니까? $ name eq $ a; # 첫 줄을 나타낼 것 $ name = $ a; – jmcneirney

답변

2

먼저 라인 :이 WRITING 위해 파일을 여는 것처럼

open (INPUT, ">", "$input_file") 

은 같은데 - 당신이 바로, 그것을 읽고 싶어?

실제 CSV 파일을 다루는 경우 쉼표로만 나누는 대신 Text::CSV을 탐색 할 수 있습니다. 그것은 모든 최신 버전 기본으로 제공하고, 핸들 피할 수 :

말했다
ID  Quote    Date 
1   No, I'm fine   1/1/2016 
2   Roger Winco   5/1/2016 

, 손에 진짜 문제 ... 반복하지 않는 이름을 가정

, 열거 할 수 있어야한다 출력 파일 핸들을 지정하고 종료 단어에 도달 할 때까지 계속 사용하십시오.

+0

"모든 최신 버전에는 표준으로 제공됩니다."불행히도 이것은 그렇지 않습니다. 어쩌면 Text :: Balanced 또는 Text :: ParseWords를 생각하고 있을까요? – ThisSuitIsBlackNot

+0

@ThisSuitIsBlack 아니요 - 그럴 줄 알았지 만 틀렸어 야합니다. 수정 해줘서 고마워. – Hambone

관련 문제