Разделить список через запятую, где запятые в тексте не экранированы - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю с устаревшими данными, которые обычно имеют формат:

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"

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

В вашем случае я буду использовать регулярное выражение и проверять нужную мне группу. Это пример, который, я надеюсь, поможет вам

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";
}
0 голосов
/ 15 февраля 2019

Быстрый пример использования 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

Это не-core модуль, так что вам придется установить его с вашим любимым клиентом CPAN или менеджером пакетов вашей ОС.Если при этом не будет автоматически установлена ​​ Text :: CSV_XS , вы, вероятно, захотите сделать это, чтобы получить оптимизированную реализацию, которую Text::CSV будет автоматически использовать при ее наличии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...