【问题标题】:Reading CSV file in perl在 perl 中读取 CSV 文件
【发布时间】:2014-02-10 20:58:05
【问题描述】:

我正在使用 Perl 脚本读取 CSV 文件,我有一个 CSV 文件,其中第一列中有数据包,前面有标签号

例子:

Packet0,tag1,tag2,tag3
packet1,tag1,tag2,tag3,tag4
packet2,tag1

我已经制作了这个脚本:

my @parts = ();
my @tag = ();
my $j=0;
open CSVFILE, 'data.csv';
while (my $row = <CSVFILE>) {
  chomp;
  my @line = split(/\s?,\s?/, $row);
  push @packet, $line[0];

  for (my $i = 1; $i <= $#line; $i++) {
    $tag[$i][$j] = $line[$i]; 
  }
  j++;
}

但是这段代码对我不起作用,谁能帮我解决我哪里出错了?

【问题讨论】:

  • 您的期望是什么,应该怎么做?
  • 它应该给我两个数组,@packets,它将包含数据包名称和@tag,它将包含标签号,我使用了二维数组,以便我可以存储各自的标签号的数据包。 tag[packet0][tag1] = tag[0][0] &amp; tag[packet1][tag1] = tag[1][0]
  • 您指的是一个数组@csv_line,它没有声明或分配给代码中的任何位置。此外,您不会增加 $j。还有更多:chomp 不会影响你的循环变量$row,它会影响$_
  • 谢谢,刚刚更正,但阅读方式仍然不正确
  • 你怎么知道的?您没有打印任何内容或保存数据。

标签: perl


【解决方案1】:

如果您熟悉 CPAN,有一些库可以为您解决这个问题:

https://metacpan.org/pod/Text::CSV

正确执行 CSV 可能会很棘手。尤其是在引用和多行字段时。

【讨论】:

  • 我支持这个。不要让 CSV 格式的明显简单性欺骗了您。 Text::CSV 模块很容易使用并且可以很好地处理边缘情况。
  • 谢谢,这个$arrayref = $csv-&gt;getline_all ($io, $offset); 可以解决我的问题吗?我正朝着正确的方向前进?
【解决方案2】:
#/usr/bin/perl -w
use strict;
use warnings;

my @packet = ();
my @tag = ();
my $j = 0;

...
while (my $row = <CSVFILE>) {
  my @line = split(/\s?,\s?/, $row);
  push @packet, shift(@line);
  $tag[$j] = [ @line ]; #or push @tag, \@line;
  $j++;
}
...

【讨论】:

  • 写得更好push @tag, \@line
猜你喜欢
  • 2012-01-24
  • 2014-07-25
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2017-08-05
相关资源
最近更新 更多