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

String Perl:在给定字符串处拆分CSV,并使用特定字符串作为文件名,string,perl,loops,csv,split,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

因此,我有几个大型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;
使用严格;
使用警告;
###输入
我的$split_woord='END'#表示要拆分的文件的字
打印“输入文件:”;
我的$file_name=;
my$input\u file=“file location/$file\u name.csv”;
###打开
打开(输入“>”、“$INPUT\u文件”)或死亡“无法打开$file\u名称:$!\n”;
我的$name=undf;
而(){
我的$line=$\ux;
my($a,$b,$c,$d)=拆分(“\,”,$line);
直到($a eq$split_word){#循环直到第1列读取'END',然后重新启动
$name eq$a;#想起诉第一行吗
my$output\u file=“file\u location/$name.csv”;
打开(输出“>>”、“$OUTPUT\u文件”)或死亡“无法创建$OUTPUT\u文件:$!\n”;
打印输出“$a、$b、$c、$d\n”;
下一个
}
}
出口

我似乎无法让它正确循环,而且我也在努力使用第一列/行作为文件名。任何帮助都将不胜感激!!!TIA首先,您的产品线:

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;
my$OUTPUT;
打开我的$INPUT、“$a.csv”或die;
}
打印$OUTPUT$;
如果($a eq$split\u woord){
关闭美元输出;
$OUTPUT=undef;
}
}
关闭$INPUT;

csplit
是shell命令。必须试一试吗?也请检查其他相关问题,你打算在这里做作业吗$名称eq$a#要指示第一行$name=$a;不是任务不。。。通过接收到的大数据文件使我的工作生活更轻松,这样我就不必在excel中拆分它们了。。。我看过csplit——它没有给出文件命名的解决方案——但还是会尝试一下@当jmcneirney说“作业”时,他指的是作业操作员,而不是作业
$name eq$a
本身没有任何意义(您应该得到警告“在void上下文中无用地使用字符串eq”)。可能您想将
$a
分配给
$name
,即
$name=$a?“它是所有最新版本的标准配置”不幸的是,情况并非如此。也许你想的是Text::Balanced还是Text::ParseWords?@ThisSuitesBlack不是——我想是的,但我一定搞错了。谢谢你的更正