В Perl, как я могу правильно анализировать файлы с разделителями табуляцией/пробелом со строками в кавычках?

Мне нужно проанализировать файлы с разделителями табуляцией/пробелом, которые имеют много столбцов в Perl. Значения таковы, что есть большие строки, заключенные в двойные кавычки. Эти строки могут содержать любые символы, такие как табуляции и пробелы или что-то еще.

Когда я пытаюсь проанализировать их с помощью функции разделения, она также разделяет эти строки. Теперь, как я могу заставить perl понять, что строки внутри " " являются записью одного столбца?

Простой пример:

12  345546.67677   "Hello World!!!" -567.55656 0.5465767 "Hello_Again;   "

person sfactor    schedule 21.12.2010    source источник


Ответы (3)


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

my $csv = Text::CSV->new({sep_char => "\t"});
person moinudin    schedule 21.12.2010

Обратите внимание, что вы говорите разделители табуляцией/пробелом. Если разделители смешаны и/или вы должны рассматривать последовательные пробелы как один, используйте Text::ParseWords может быть проще:

#!/usr/bin/perl

use Text::ParseWords qw( quotewords );
use YAML;

while ( my $line = <DATA> ) {
    print Dump [ quotewords('\s+', 0, $line) ];
}

__DATA__
12  345546.67677   "Hello World!!!" -567.55656 0.5465767 "Hello_Again;   "

Выход:

---
- 12
- 345546.67677
- Hello World!!!
- -567.55656
- 0.5465767
- 'Hello_Again;   '
person Sinan Ünür    schedule 21.12.2010

Другие возможности: Regexp::Common::balanced и Text::Balanced.

person Leolo    schedule 21.12.2010