Как разбить строку по запятой, не включая запятую внутри кавычки в Perl? - PullRequest
1 голос
/ 22 ноября 2011

У меня есть этот код ниже:

my $file = 'c:\test.log';
open (FILE, "<", $file) or die $!;
my @list = grep /\bAdobe\b/, <FILE>;
my $days;
foreach (@list) {
$days = $_;
print "$days\n";
}

Ожидаемый результат:

"Adobe","10:10:10, 11/10/2011","Ready"

Я хочу разделить результат запятой с помощью этого кода ниже:

my @sample = split(',', $days);

Ожидаемый результат:

"Adobe"
"10:10:10
11/10/2011"
"Ready"

но это не то, что я хотел сделать:

Я хочу напечатать вывод следующим образом:

"Adobe"
"10:10:10, 11/10/2011"
"Ready"

КакМогу ли я достичь этого без использования / установки любого модуля, такого как Text :: CSV.

Пожалуйста, сообщите, спасибо.

Ответы [ 4 ]

6 голосов
/ 22 ноября 2011

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

split /(?<="),(?=")/, $days;
4 голосов
/ 22 ноября 2011

Я считаю, что это работает для Text::CSV модуля. Что-то вроде этого примера должно работать:

use Text::CSV;

my $file = 'c:\test.log';
open (my $FILE, "<", $file) or die $!;
my $csv = Text::CSV->new;

while (my $row = $csv->getline($FILE)) {
  my @sample = @$row;
  next if $sample[0] !~ /\bAdobe\b/;
  # do whatever you want
}
2 голосов
/ 22 ноября 2011

Нет необходимости устанавливать Text :: CSV из CPAN (хотя, если у вас есть это ограничение, вам действительно нужно это исправить), так как модуль Text :: ParseWords из стандартного дистрибутива может быть используется тоже.

1 голос
/ 22 ноября 2011

Поскольку строка "Adobe","10:10:10, 11/10/2011","Ready" действительна как код perl, вы можете использовать eval:

my $file = 'c:\test.log';
open my $fh, "<", $file or die $!;
for (grep /\bAdobe\b/, <FILE>) {
    my @sample = eval;
    # code here
}

Но делайте это только для данных, которые, как вы уверены, имеют допустимый формат.

Вывод из Данные :: Дампер :

$VAR1 = [
          "Adobe",
          "10:10:10, 11/10/2011",
          "Ready"
        ];
...