Perl Text::CSV_XS | getline()正在合并行



我使用Text::CSV_XS模块读取csv文件以进行进一步处理。当我试图将这些行加载到sql server db中时,我一直在碰壁,我已经将问题隔离到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查找未加引号的nrrn来确定eol。据我所知,,n似乎导致丢失字段和不正确的字段/列计数。我知道如何修复这个行后读取,但不是之前。如果我找到任何解决方案,我会继续进行故障排除和更新。

下面是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。当我删除该属性时,代码可以在给定输入的情况下正常运行。

该属性应该只用于解析,但它会导致在应用任何函数之前创建csv对象失败。如果我猜,我会认为这是一个版本问题,我们的版本不包括这个属性skip_empty_rows。我得到这个错误与error_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。下面是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)

相关内容

  • 没有找到相关文章

最新更新