代码之家  ›  专栏  ›  技术社区  ›  Derek

拆分逗号分隔的列表,其中文本中的逗号不转义

  •  0
  • Derek  · 技术社区  · 5 年前

    我正在处理传统数据,这些数据通常采用以下格式:

    QID    RESPONSE
    

    但是,在某些情况下,响应包含不同类型的多个值:

    01320   2,35,6,"warm"
    

    我试过用

    my @dataRowAsList = split('\t', $_); 
    my $questionID = $dataRowAsList[0];     
    my $response = substr($dataRowAsList[1],0,-2);
    my @thisResponse = split(',', $response);
    

    在相关案例中,将输出分为问题和响应,然后将每个响应分为组成部分

    不过,我刚刚发现了这种情况:

    01320   2,35,6,"warm,windy"
    

    引号中的逗号没有转义

    有没有一种简洁的方法将其解析为组件?

    2
    35
    6
    "warm,windy"
    
    0 回复  |  直到 5 年前
        1
  •  9
  •   Shawn    5 年前

    快速示例 Text::CSV 用于读取字符串:

    #!/usr/bin/perl
    use warnings;
    use strict;
    use feature qw/say/;
    use Text::CSV;
    
    my $str = q/01320   2,35,6,"warm,windy"/;
    
    my $csv = Text::CSV->new({auto_diag => 2});
    
    my @fields = split " ", $str, 2;
    
    say '$fields[0] is ', $fields[0];
    say '$fields[1] is ', $fields[1];
    
    say 'Parsed out $fields[1] is:';
    $csv->parse($fields[1]);
    say for $csv->fields;
    

    运行此命令将产生:

    $fields[0] is 01320
    $fields[1] is 2,35,6,"warm,windy"
    Parsed out $fields[1] is:
    2
    35
    6
    warm,windy
    

    这是一个非核心模块,因此您必须将其与您喜爱的cpan客户机或操作系统的包管理器一起安装。如果这样做不会自动安装 Text::CSV_XS ,您可能还希望获得一个优化的实现 Text::CSV 如果存在,则自动使用。

        2
  •  -1
  •   Free Code    5 年前

    在您的情况下,我将使用regexp并检查我需要的组,这是一个示例,我希望它将帮助您

    use warnings;
    use strict;
    my $string = '01320 2,35,6,"warm,windy"';
    
    if ($string =~ /^(\d+)\t(\d+),{1}(\d+),{1}(\d+),{1}(\S+)$/gu) {
            print "$1\n$2\n$3\n$4\n$5\n\n";
    }