珀尔 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_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。下面是 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)
我正在使用 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_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。下面是 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)