Regex 如何使用Perl解析数据中带有内部逗号的CSV数据?

Regex 如何使用Perl解析数据中带有内部逗号的CSV数据?,regex,perl,Regex,Perl,我需要解析的数据如下所示: [fild1, filed2, .... filedn] , [filed1, filed2, .... filedn] ..... 我称之为特殊形式的数据,因为有两种逗号: []对之外的逗号是 作为两者之间的分隔物 不同的记录 []对中的逗号是 作为两者之间的分隔物 不同的领域 因此,在这种情况下,使用split(',',$data)将无法满足我的需要,即解析数据并获取数据中的每条记录 怎么样:my@parts=split(/\]/,$data),然后您可以迭代@

我需要解析的数据如下所示:

[fild1, filed2, .... filedn] , [filed1, filed2, .... filedn] .....
我称之为特殊形式的数据,因为有两种逗号:

  • []对之外的逗号是 作为两者之间的分隔物 不同的记录
  • []对中的逗号是 作为两者之间的分隔物 不同的领域

  • 因此,在这种情况下,使用
    split(',',$data)
    将无法满足我的需要,即解析数据并获取数据中的每条记录

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

    也可以这样进行初始拆分:
    my@parts=split(/\],/,$data),这将节省您以后的清理工作。只需确保只有在数据的空格一致时才使用此方法。

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

    也可以这样进行初始拆分:
    my@parts=split(/\],/,$data),这将节省您以后的清理工作。只需确保只有在数据的空格一致时才使用此方法。

    这应该可以完成以下任务:

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

    这应该可以做到:

    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'
            ];
    
    去掉第一个“[”和最后一个“]”


    然后去掉第一个“[”和最后一个“]”。

    这里有一个简单的例子,它假设
    $data
    中的值是有效的

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

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

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

    您还可以尝试Text::CSV或Text::csvxs。转到CPAN下载。

    您也可以试用Text::CSV或Text::csvxs。转到CPAN下载。

    对于拆分来说,这是一个糟糕的正则表达式,因为拆分的第一个参数总是被解释为正则表达式。对于拆分来说,这是一个糟糕的正则表达式,因为拆分的第一个参数总是被解释为正则表达式。谁说了Python?@carillonator,这只是标准的Python vs Perl火焰诱饵。忽略它或标记它。可悲的是,这是非常典型的。谁说过Python?carillonator,这只是标准的Python vs Perl火焰诱饵。忽略它或标记它。可悲的是,这种情况相当典型。