Как я могу анализировать данные CSV с внутренними запятыми в данных, используя Perl? - PullRequest
1 голос
/ 21 декабря 2009

Данные, которые мне нужно проанализировать, выглядят так:

[fild1, filed2, .... filedn] , [filed1, filed2, .... filedn] .....

Я называю это особой формой CSV данных, потому что есть два вида запятой:

  1. запятые вне пары []: служил разделителем между разные записи.
  2. эти запятые внутри пары [] служил разделителем между разные поля.

Так что в этом случае использование split(',' , $data) не будет отвечать моим потребностям, а именно: проанализировать данные и получить каждую запись в данных.

Ответы [ 5 ]

5 голосов
/ 21 декабря 2009

Это должно сделать работу:

my @out = map{[split/,/]} $data =~ /\[([^\]]+)\]/g;

пример:

use Data::Dumper;
$data='[1,2,3],[4,5],[6]';
@a=map{[split/,/]} $data =~ /\[([^\]]+)\]/g;
print Dumper @a;

Выход:

$VAR1 = [
          '1',
          '2',
          '3'
        ];
$VAR2 = [
          '4',
          '5'
        ];
$VAR3 = [
          '6'
        ];
2 голосов
/ 21 декабря 2009

Как насчет: my @parts = split(/\]/, $data);, и затем вы можете выполнить итерацию по @parts, удалить заголовок [ и снова разделить на ","

Вы также можете сделать начальное разделение следующим образом: my @parts = split(/\] , /, $data); и это избавит вас от лишней очистки позже. Просто используйте этот метод только в том случае, если пробелы в ваших данных совпадают.

1 голос
/ 21 декабря 2009
my @a = split /\]\s*,\s*\[/, $data;

и избавьтесь от первого '[' и последнего ']'.

0 голосов
/ 23 декабря 2009

Вы также можете попробовать Text :: CSV или Text :: CSV_XS. перейдите на CPAN для загрузки.

0 голосов
/ 21 декабря 2009

Вот краткий пример, который предполагает, что значение в $data является действительным.

my @data = map { [ split ',', $_ ] } $data =~ / \[ ([^\[\]]*) \] ,? /xg;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...