未填充Perl Text :: CSV $ csv-> fields()属性

时间:2013-05-31 13:27:52

标签: perl csv

我有一个脚本,可以通过售卖系统将CSV中的传入数据重新格式化为可读格式。我可能会发疯,但我很确定它在生产环境中工作了一两周。然而,在过去一两周的某个时刻,它停止了工作。我将问题跟踪到Text :: CSV模块,而不是填充$ csv-> fields()属性。

my $csv = Text::CSV->new({sep_char => '|', allow_loose_quotes => 1});
$csv->column_names($csv->getline(*READ));
my @keys = $csv->fields;

现在,在我的本地计算机上(至少在我的脑海中,两周前也在生产环境中),这将使用已解析的标题字段填充@keys。但是,现在,在生产和预生产中,这都失败了。我唯一的区别是我的机器运行的是perl 5.12.4,而prod / pprd是5.8.8。两者上的Text :: CSV模块都是1.21。

在我的机器上,如果我使用Data :: Dumper并转储$ csv对象,则部分属性为

'_FIELDS' => [
    'ID',
    'IDCARD_TYPE',
    'FIRST_NAME',
    'MIDDLE_NAME',
    'LAST_NAME',
    ...
    'EMAIL',
],

在其他机器上:

'_FIELDS' => undef,

我通过使用$ csv-> column_names填充@keys来解决这个问题,但是看起来似乎不对,我真的想知道发生了什么。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

根据Text::CSV documentation,返回undef是调用fields()getline()的预期结果。首先尝试使用parse()。您可能在本地计算机上使用此模块的不同版本。您可以使用perl -MText::CSV -e 'print $Text::CSV::VERSION'检查版本。

  

请注意,使用getline()后返回值是未定义的   不会填充parse()返回的数据结构。

答案 1 :(得分:0)

以下替代顺序为我工作:

$file = "test.csv" ;      
if(!open($fh, "<", $file )) {
  # Cannot call getline is a symptom of a bad open() 
  printf("### Error %s: could not open file %s\n", $ws, $file) ;
  close($fh) ;
  exit 1 ;
}
while(my $row = $csv->getline($fh)) {
  # $row is a pointer to an Array
  #     The array is already parsed.
  @items = @{$row} ;
  for(my $i=0 ; $i<=$#items; $i++) {
    printf("Field %d: (%s)\n", $i, $items[$i] ) ;
  }
}
close $fh ;