所以我有几个大的CSV文件,包含多个列和行(每行6000个行和+60个列),我想在给定的字符串中拆分成单独的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(包含单词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 :(得分: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;