2

我有一个非常奇怪(至少对我来说!)的情况,我在 perl 中解析的 csv 文件在几周内都运行良好,但现在它突然无法正确解析。

相关信息:

  1. 该文件是每周更新的 Salesforce.com 的摘录
  2. 该文件以逗号分隔,没有转义字符,据我所知 3)我已经玩了一些new属性,但仍然没有运气,真的
  3. 今天的文件大约有 16 行(包括标题和底部的一些无关的行,我不关心)。所以我要评估 7 行数据。

我的 perl 代码如下。我认为它很可靠,但也许我缺少一个设置,因为文件被读取为 1 个长字符串,就像我使用时一样print $.print $_我只得到 1 个结果,即 1 行中的整个文件。然后,当然,该行不会解析(并且错误消息很神秘)。

更新:

我发现问题出在从 SFDC 生成文件的方式上。该文件CR具有End of Line. 我下载了今天的文件,它CRLF. 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;
4

1 回答 1

1

您修改后的问题的答案是没有更改换行符的选项。您可以在http://metacpan.org/pod/Text::CSV查看所有 Text::CSV 选项。那里的逐字记录选项似乎很相关,所以我为你准备了一个谷歌,但找不到任何东西。(除其他外,“intitle:text intitle:csv intitle:verbatim”没有产生任何结果。)

于 2014-05-18T18:55:23.400 回答