首页 > 解决方案 > 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';

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

'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';

这样 perlsplit就不会将单个字段拆分GSA-rs16997168,rs16997168为两个单独的字段

即如果逗号介于两者之间,则逗号应替换为分号"我在Google上找不到如何执行此操作

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

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

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

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

标签: regexperlcsv

解决方案


当存在完美的解析器时,为什么要尝试重新创建 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);
}

推荐阅读