【问题标题】:perl Text::CSV parsingperl 文本::CSV 解析
【发布时间】:2014-05-19 04:08:54
【问题描述】:

我有一个非常奇怪的情况(至少对我来说是这样!),我在 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 来解析文件。虽然没有反映在下面的代码中,但我已经尝试了 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 =&gt; 1' 但你没有显示。我还没有在任何数据上尝试过你的脚本,但我没有看到任何直接的恐怖(除了二进制问题)。

标签: perl


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2021-02-28
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多