1

我有一个脚本,可以将来自 CSV 的传入数据重新格式化为销售系统的可读格式。我可能要疯了,但我很确定它在一两个星期前在生产环境中工作。但是,在过去一两周的某个时间点,它停止了工作。我将问题追溯到未填充 $csv->fields() 属性的 Text::CSV 模块。

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 来解决这个问题,但是似乎有些不对劲,我真的很想弄清楚发生了什么。有任何想法吗?

4

2 回答 2

2

根据Text::CSV 文档,返回undeffields()after call的预期结果getline()。先尝试使用parse()。您可能在本地计算机上使用此模块的不同版本。您可以使用perl -MText::CSV -e 'print $Text::CSV::VERSION'.

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

于 2013-05-31T13:47:00.690 回答
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 ;
于 2015-12-29T20:21:38.193 回答