珀尔 Text::CSV_XS | getline() 正在组合线

Perl Text::CSV_XS | getline() is combining lines

我正在使用 Text::CSV_XS 模块读取 csv 文件以进行进一步处理。我在尝试将行加载到 sql 服务器数据库时遇到了困难,我已将问题隔离到 Text::CSV_XS 模块,特别是 getline().

getline 似乎合并了两行,导致字段计数不正确(24 列,但得到 48 个字段)。我查看了原始数据,发现有一行缺少它的最后一个值。

这是一个浓缩示例:

RowNum , Firstname ,  Lastname ,  EmailAddress
-------------------------------
1      , Joe       ,  Schmo    ,  "Joe.Schmo@email.com"\n
2      , Edgar     ,  Elbows   ,  \n
3      , Amanda    ,  Ankles   ,  "Amanda.Ankles@email.com"\n

这是阅读后的问题:

'1','Joe','Schmo','Joe.Schmo@email.com'

'2','Edgar','Elbows','3','Amanda','Ankles','Amanda.Ankles@email.com'

=====================

简而言之,getline默认是寻找不带引号的\n\r\r\n来确定eol。据我所知,,\n 似乎导致字段丢失和不正确的 field/column 计数。我知道如何在阅读这些行之后解决这个问题,但之前不会。如果找到任何解决方案,我会继续进行故障排除和更新。

根据要求,这里是 Text::CSV_XS 构造函数:

my $csv = Text::CSV_XS->new({ 
                             binary          => 1,
                             always_quote    => 1,
                             verbatim        => 1,
                             skip_empty_rows => 1 
                             });

很遗憾,我无法提供我正在使用的数据的副本。

根据要求在评论中添加猜测作为答案。

出于某种原因,当我 运行 这样做时,我的 CSV_XS 无法识别属性 skip_empty_rows。当我删除该属性时,给定输入的代码 运行s 没有问题。

该属性应该只用于解析,但它会导致 csv 对象的创建在应用任何函数之前失败。如果让我猜的话,我会认为是版本问题,我们的版本不包含这个属性skip_empty_rowserror_diag 函数出现此错误:

# CSV_XS ERROR: 1000 - INI - Unknown attribute 'skip_empty_rows' @ rec 0 pos 0
Can't call method "getline" on an undefined value at foo.pl line 15.

代码:

my $csv = Text::CSV_XS->new({ 
        binary          => 1,
        always_quote    => 1,
        verbatim        => 1,
        skip_empty_rows => 1,
    }) or Text::CSV_XS->error_diag ();

更新:

我的假设是正确的,skip_empty_rows 属性是在 1.46 版(最新版本)中引入的,而我的版本是 1.44。下面是 ChangeLog for Text::CSV_XS:

1.46    - 2021-03-24, H.Merijn Brand
    * It's 2021
    * New attribute comment_str     (RFC 4180-bis)
    * New attribute skip_empty_rows (RFC 4180-bis)
    * http -> https in links in docs
    * Fix several issues with auto-detecting \r as EOL
    * Tested on perl-5.6.1 .. perl-5.32.1 and perl-5.33.8 (145)