【问题标题】:Split a comma separated list where commas in text aren't escaped拆分一个逗号分隔的列表,其中文本中的逗号不会被转义
【发布时间】:2019-02-17 05:18:04
【问题描述】:

我正在处理通常采用以下格式的遗留数据:

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"

【问题讨论】:

  • 使用 Text::CSV 或其他 CSV 模块。

标签: regex perl


【解决方案1】:

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】:

    在您的情况下,我将使用正则表达式并检查我需要的组,这是一个示例,希望对您有所帮助

    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";
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      相关资源
      最近更新 更多