2009-12-21 46 views
1

我需要解析看起来像数据:如何使用Perl在数据中使用内部逗号分析CSV数据?

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

我把它叫做CSV数据的一种特殊形式,因为有两种逗号:

  1. 那些逗号[]对外面是 担任 不同记录之间的分隔符。
  2. []中的那些逗号对是 担任 不同字段之间的分隔符。

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

+2

谁对Python有什么看法? – carillonator 2009-12-21 17:06:39

+2

@carillonator,它只是标准的Python与Perl的火焰诱饵。忽略它或标记它。可悲的是,它在SO上相当典型。 – daotoad 2009-12-21 17:39:46

回答

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

如何:my @parts = split(/\]/, $data);,然后你就可以在@parts迭代,删除标题[和分裂一次由多个“”

您也可以像这样最初的分裂: my @parts = split(/\] , /, $data);,这将节省您的稍后再进行一些清理。只要你的数据的空格是一致的,就一定要使用这种方法。

+0

这是一个不好的正则表达式,因为split的第一个参数总是被解释为正则表达式。 – 2009-12-21 16:39:03

+0

这个正则表达式有什么问题? – Dana 2009-12-21 16:40:06

+0

对我来说看起来还行...... – Yair 2009-12-21 16:45:28

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

,摆脱第一的 '[' 和过去“] ”。

0

这是一个快速示例,假定$data中的值有效。

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

你也可以试用Text :: CSV或Text :: CSV_XS。去CPAN下载。

相关问题