Perl:在给定字符串处拆分CSV并使用特定字符串作为文件名

时间:2016-10-12 18:52:07

标签: string perl loops csv split

所以我有几个大的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

1 个答案:

答案 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;