Perl内部的多级拆分

con*_*con 1 regex csv perl

我有一个来自CSV文件的字符串:

my $str = 'NA19900,4,111629038,0;0,0;0,"GSA-rs16997168,rs16997168,rs2w34r23424",C,T,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0';
Run Code Online (Sandbox Code Playgroud)

应该翻译(以某种方式)为

'NA19900,4,111629038,0;0,0;0,"GSA-rs16997168;rs16997168;rs2w34r23424",C,T,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0';
Run Code Online (Sandbox Code Playgroud)

这样perl split不会将单个字段GSA-rs16997168,rs16997168分成两个单独的字段

也就是说,如果逗号介于两者之间,则应将逗号替换为分号,但"我在Google上找不到该方法

到目前为止,我已经尝试过:

  1. $str =~ s/"([^"]+),([^"]+)"/"$1;$2"/g; 但这失败了> 2个表达式

  2. 如果我能以某种方式告诉perl split函数将""一个字段中的所有内容都计为一个字段,那将是很棒的,即使该文本具有,分隔符,但我也不知道该怎么做:(

  3. 我听说过前瞻,但是在这里我看不到如何使用它们:(

ike*_*ami 9

当存在完美的CSV分析器时,为什么要尝试重新创建它呢?

use Text::CSV_XS qw( );

my $csv = Text::CSV_XS->new({ binary => 1, auto_diag => 2 });
while ( my $row = $csv->get_line($fh) ) {
   $row->[5] =~ s/,/;/g
   $csv->say(\*STDOUT, $row);
}
Run Code Online (Sandbox Code Playgroud)