如何使用Perl在数据中使用内部逗号解析CSV数据?

时间:2009-12-21 16:27:43

标签: regex perl

我需要解析的数据如下:

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

我将其称为CSV数据的特殊形式,因为有两种逗号:

  1. []对之外的那些逗号是 担任之间的分隔符 不同的记录。
  2. []对中的逗号是 担任之间的分隔符 不同的领域。
  3. 因此,在这种情况下,使用split(',' , $data)将无法满足我的需求,即解析数据并获取数据中的每条记录。

5 个答案:

答案 0 :(得分:5)

这应该做的工作:

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'
        ];

答案 1 :(得分:2)

如何:my @parts = split(/\]/, $data);,然后您可以迭代@parts,删除标题[并再次拆分“,”

您也可以像这样进行初始拆分:  my @parts = split(/\] , /, $data);这将为您节省更多的清理工作。如果数据的空格是一致的,请确保只使用此方法。

答案 2 :(得分:1)

my @a = split /\]\s*,\s*\[/, $data;

并摆脱第一个'['和最后']'。

答案 3 :(得分:0)

以下是一个快速示例,假设$data中的值有效。

my @data = map { [ split ',', $_ ] } $data =~ / \[ ([^\[\]]*) \] ,? /xg;

答案 4 :(得分:0)

您还可以尝试Text :: CSV或Text :: CSV_XS。去CPAN下载。