【发布时间】:2017-02-21 16:58:03
【问题描述】:
所以我有几个大型 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 表示这是要为该文件写入的最后一行。 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
【问题讨论】:
-
csplit是 shell 命令。一定要试试吗?? -
也请检查与stackoverflow.com/questions/8272017/…相关的其他问题
-
你是要在这里做作业吗? $name eq $a; #想要表示第一行 $name = $a;
-
不是一个任务,没有...尝试使用我收到的大型数据文件让我的工作生活更轻松,这样我就不必费力地将它们拆分为 excel...我看了csplit - 它没有为文件命名提供解决方案 - 但仍然会尝试一下!
-
@DKru 当 jmcneirney 说“作业”时,他指的是作业运算符,而不是作业作业。
$name eq $a本身没有任何意义(并且您应该收到警告“在 void 上下文中无用使用字符串 eq”)。也许您打算将$a分配给$name,即$name = $a;?
标签: string perl loops csv split