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

Der*_*rek 2 regex perl

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

QID    RESPONSE
Run Code Online (Sandbox Code Playgroud)

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

01320   2,35,6,"warm"
Run Code Online (Sandbox Code Playgroud)

我试过用

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

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

但是我刚刚发现了这种情况:

01320   2,35,6,"warm,windy"
Run Code Online (Sandbox Code Playgroud)

引号中的逗号不会被转义

有没有一种巧妙的方法将其解析为其组件?

2
35
6
"warm,windy"
Run Code Online (Sandbox Code Playgroud)

Sha*_*awn 9

从字符串中读取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;
Run Code Online (Sandbox Code Playgroud)

运行这将产生:

$fields[0] is 01320
$fields[1] is 2,35,6,"warm,windy"
Parsed out $fields[1] is:
2
35
6
warm,windy
Run Code Online (Sandbox Code Playgroud)

这是一个非核心模块,因此您必须使用您最喜欢的CPAN客户端或操作系统的软件包管理器进行安装.如果这样做也不会自动安装Text :: CSV_XS,您可能也希望这样做以获得一个优化的实现,Text::CSV如果存在则自动使用.