我有一个非常奇怪(至少对我来说!)的情况,我在 perl 中解析的 csv 文件在几周内都运行良好,但现在它突然无法正确解析。
相关信息:
- 该文件是每周更新的 Salesforce.com 的摘录
- 该文件以逗号分隔,没有转义字符,据我所知 3)我已经玩了一些
new
属性,但仍然没有运气,真的 - 今天的文件大约有 16 行(包括标题和底部的一些无关的行,我不关心)。所以我要评估 7 行数据。
我的 perl 代码如下。我认为它很可靠,但也许我缺少一个设置,因为文件被读取为 1 个长字符串,就像我使用时一样print $.
,print $_
我只得到 1 个结果,即 1 行中的整个文件。然后,当然,该行不会解析(并且错误消息很神秘)。
更新:
我发现问题出在从 SFDC 生成文件的方式上。该文件CR
具有End of Line
. 我下载了今天的文件,它CR
有LF
. End of Line
它完美地处理。然后我去对昨天的文件进行去敏化以发布,当我编辑它时,我得到了回车和换行作为 EOL 元素。去搞清楚!
出于某种原因,TEXT::CSV
不喜欢仅将回车作为 EOL 来解析文件。EOL
虽然没有反映在下面的代码中,但我已经尝试了方法中属性的所有可能设置TEXT::CSV->new()
。
我将问题留待解决,因为了解如何解析仅将回车作为 EOL 提要的文件可能会很有用。
use strict;
use warnings;
use diagnostics;
use Text::CSV;
my $datadump = "//myServer/WeeklyReport/data_dump.csv";
my $csv = Text::CSV->new({sep_char => ',', binary => 1});
open (CSV, "<", $datadump) or die $!;
while (<CSV>) {
chomp $_;
next if ($. == 1); # skip first line (contains headers)
if ($csv->parse($_)) { # parse the line ...
my @fields = $csv->fields();
my $opp_owner = $fields[8];
chomp $opp_owner;
$owner_hash{$opp_owner} = "ignore"; # load into hash to delete duplicates
} else { # if the line won't parse, return error
my $err = $csv->error_input;
print "Failed to parse line: $err";
}
}
close CSV;