【发布时间】:2014-05-19 04:08:54
【问题描述】:
我有一个非常奇怪的情况(至少对我来说是这样!),我在 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 来解析文件。虽然没有反映在下面的代码中,但我已经尝试了 TEXT::CSV->new() 方法中 EOL 属性的所有可能设置。
我没有回答这个问题,因为了解如何解析仅将回车作为 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;
【问题讨论】:
-
可能新输入文件的行尾与旧输入不同。
-
@mob -> 我在想这个……但我怎么知道呢?
-
在 linux/unix 上,运行
od -c filename。我不知道对 Windows 有用的工具,但是如果您在记事本中打开文件并且看起来不正确,那么这意味着您没有 Windows (\r\n) 行结尾。 -
@mob -> 是的,这是记事本中的一大行(我之前正在玩)。它在 XL 和 Notepad++ 中打开良好,但记事本是一条大线……我现在正在尝试一些东西,但有没有办法解决它?
-
正如其他人所说,发布一些数据,或前几行的十六进制转储(或八进制转储);当然,让它脱敏,但也要确保你的脚本以同样的方式在转储的数据上失败(我们试图调试无论如何都没有意义)。
Text::CSV页面说使用 'binary => 1' 但你没有显示。我还没有在任何数据上尝试过你的脚本,但我没有看到任何直接的恐怖(除了二进制问题)。
标签: perl