【问题标题】:Perl: Split CSV at given string and use specific string as file namePerl:在给定字符串处拆分 CSV 并使用特定字符串作为文件名
【发布时间】: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


【解决方案1】:

首先,你的台词:

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

看起来它正在为WRITING打开一个文件——你想阅读它,对吧?

如果您真的在处理一个真正的 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;

【讨论】:

  • "它是所有最新版本的标准配置" 不幸的是,情况并非如此。也许您正在考虑 Text::Balanced 或 Text::ParseWords?
  • @ThisSuitIsBlackNot -- 我以为是,但我一定是弄错了。感谢指正
猜你喜欢
  • 2023-03-05
  • 2019-10-19
  • 2018-10-23
  • 2020-11-08
  • 2015-12-18
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多