我使用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查找未加引号的n
、r
或rn
来确定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)