我有一个脚本,可以通过售卖系统将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来解决这个问题,但是看起来似乎不对,我真的想知道发生了什么。有什么想法吗?
答案 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 ;