2011-10-06 67 views
1

我不確定從哪裏開始使用這個...我的客戶從他的供應商獲取庫存數據,但他們現在以不同的格式發送,這裏是一個示例代碼片段:Perl正則表達式和數據提取/操作

[["BLK",[["Black","0F1315"]],[["S","813"],["M","1378"],["L","1119"],["XL","1069"],["XXL","412"],["3XL","171"]]],["BOT",[["Bottle","15451A"]],[["S","226"],["M","425"],["L","772"],["XL","509"],["XXL","163"]]],["BUR",[["Burgundy","73002E"]],[["S","402"],["M","530"],["L","356"],["XL","257"],["XXL","79"]]],["DNA",[["Deep Navy","000F33"]],[["S","699"],["M","1161"],["L","1645"],["XL","1032"],["XXL","350"]]],["EME",[["Emerald","0DAB5E"]],[["S","392"],["M","567"],["L","613"],["XL","431"],["XXL","97"]]],["HEA",[["Heather","C0D4D7"]],[["S","374"],["M","447"],["L","731"],["XL","386"],["XXL","115"],["3XL","26"]]],["KEL",[["Kelly","0FFF00"]],[["S","167"],["M","285"],["L","200"],["XL","98"],["XXL","45"]]],["NAV",[["Navy","002466"]],[["S","451"],["M","1389"],["L","1719"],["XL","1088"],["XXL","378"],["3XL","177"]]],["NPU",[["Purple","560D55"]],[["S","347"],["M","553"],["L","691"],["XL","230"],["XXL","101"]]],["ORA",[["Orange","FF4700"]],[["S","125"],["M","273"],["L","158"],["XL","98"],["XXL","98"]]],["RED",[["Red","FF002E"]],[["S","972"],["M","1186"],["L","1246"],["XL","889"],["XXL","184"]]],["ROY",[["Royal","1500CE"]],[["S","1078"],["M","1346"],["L","1102"],["XL","818"],["XXL","135"]]],["SKY",[["Sky","91E3FF"]],[["S","567"],["M","919"],["L","879"],["XL","498"],["XXL","240"]]],["SUN",[["Sunflower","FFC700"]],[["S","843"],["M","1409"],["L","1032"],["XL","560"],["XXL","53"]]],["WHI",[["White","FFFFFF"]],[["S","631"],["M","2217"],["L","1666"],["XL","847"],["XXL","410"],["3XL","74"]]]]

首先,將inital [和端]可以除去

那麼它需要被分解成的顏色的段,即:

["BLK",[["Black","0F1315"]],[["S","813"],["M","1378"],["L","1119"],["XL","1069"],["XXL","412"],["3XL","171"]]]

這裏需要BLK,下一個區塊[["Black","0F1315"]]可以忽略。

接下來,我需要把股票數據爲每個尺寸["S","813"]

所以我應該有一個數據,如:

$col = BLK 
$size = S 
$qty = 813 

$col = BLK 
$size = M 
$qty = 1278 

,並重復這一細分市場在數據每一種顏色seqment。

數據中的色彩段數量會有所不同,其中的大小分段數量也會不同。同樣,上漿部分的顏色也會隨着顏色的不同而不同,也就是說BLK可能有6種尺寸,但RED只有5種尺寸。然後以準備好的格式進行處理。

對不起,長時間的消息,我似乎無法讓我今天回頭!

問候,

斯圖

回答

3

大廈Tim Pietzcker's answer

... 
my $deserialized = from_json($json_string); 
foreach my $group (@$deserialized) { 
    my ($color, undef, $sizes) = @$group; 
    print join(":", $color, @$_), "\n" for @$sizes; 
} 

(是的,對於這種特殊的格式,eval應該做的,以及from_json,儘管後者是更安全的。然而,你應該嘗試找到正式的規範。格式:?!是不是真的JSON或別的東西)

+0

謝謝,效果很好。與供應商覈實,這是肯定的JSON,但只要'eval'去,我總是與信任沒有人選擇,只是在一些壞毛骨悚然! –

4

這看起來像是有效的JSON我,爲什麼不使用JSON parser,而不是試圖用一個正則表達式來解決這個問題?

use JSON; 
my $json_string = '[["BLK",[["Black","0F1315"]],[["S","813"...<snip>'; 
my $deserialized = from_json($json_string); 

然後你可以遍歷數組並提取你需要的信息。

+0

謝謝蒂姆,有沒有什麼機會讓我看看如何處理這個結果,我還沒有使用json的經驗 –

+0

@StuAyton:它也(可能是巧合)看起來像有效的Perl代碼,所以如果你*真的*相信供應商,你可以通過'eval'餵它,看看會出現什麼...... –

+0

@IlmariKaronen但是如果我只是'eval'那麼它不是我們需要的格式 –

0

假設你已經在$ STR數據,然後的eval(EXPR)(危險時便會羅賓遜),並處理由此產生的數據結構:

my $struct = eval $str; 

foreach my $cref (@$struct) { 
    my($color, undef, $sizerefs) = @$cref; # 3 elements in each top level 
    foreach my $sizeref (@$sizerefs) { 
     my($size, $qty) = @$sizeref; 
     print "$color:$size:$qty\n"; 
    } 
}