2009-12-21 44 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下載。

相關問題