2016-10-12 56 views
1

因此,我有幾個大的CSV文件,其中包含幾列和多行(每行6000奇數行和+ -60列),我想將它們拆分爲單獨的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字樣表明這是要爲此文件寫入的最後一行。彼得包含範圍A1(包含單詞彼得)到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'是shell命令。必須嘗試嗎? – Ashish

+0

也請檢查SO其他相關問題http://stackoverflow.com/questions/8272017/split-files-based-on-file-content-and-pattern-matching – Ashish

+1

你是否有意在這裏做一個任務? $ name eq $ a; #將顯示第一行$ name = $ a; – jmcneirney

回答

2

首先,你行:

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

看起來像是打開一個文件寫作 - 你想讀它,對嗎?

如果你真的在處理一個真正的CSV文件,你可能想探索Text::CSV,而不是隻用逗號分割。它配備了所有最新版本的標準,它處理不可避免的:

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

這就是說,手頭真正的問題...

假設名稱不重複,你應該能夠打開一個輸出文件句柄並繼續使用它,直到它遇到終止字:

my $OUTPUT; 

open my $INPUT, '<', "$file_name.csv" or die; 
while (<$INPUT>) { 
    my ($a) = split /,/, $_, 2; 

    if ($OUTPUT eq undef) { 
    open $OUTPUT, '>', "$a.csv" or die; 
    } 

    print $OUTPUT $_; 

    if ($a eq $split_woord) { 
    close $OUTPUT; 
    $OUTPUT = undef;   
    } 
} 
close $INPUT; 
+0

「它帶有所有最新版本的標準」不幸的是,事實並非如此。也許你正在考慮Text :: Balanced或Text :: ParseWords? – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot--我以爲是的,但我一定是錯的。感謝您的更正 – Hambone

相關問題