2013-03-02 26 views
1

Perl的解析文本文件我有以下的隨機結構文件:定期expresssion

USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="AAA" FORMAT="ascii" TEXT="L2" 

USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="BBB" THRESHOLDID="1" FORMAT="ascii" TEXT="L2" 

我試圖用Perl來解析它得到像下面這樣的值:

1362224754632; 00966590832186; 580; AAA; L2

下面是代碼:

if($Record =~ /USMS (.*?)|<REQ MSISDN="(.*?)" CONTRACT="(.*?)" SUBSCRIPTION="(.*?)" FORMAT="(.*?)" THRESHOLDID="(.*?)" TEXT="(.*?)"/) 
{ 
           print LOGFILE "$1;$2;$3;$4;$5;$6;$7\n"; 
} 
elsif($Record =~ /USMS (.*?)|<REQ MSISDN="(.*?)" CONTRACT="(.*?)" SUBSCRIPTION="(.*?)" FORMAT="(.*?)" TEXT="(.*?)"/) 
{ 
           print LOGFILE "$1;$2;$3;$4;$5;$6\n"; 
} 

但我總是得到:

;;;;; 

任何幫助,謝謝。 Heithem

回答

3

管(|)是正則表達式中一個特殊字符。逃脫它,如:\|,它會工作。

if($Record =~ /USMS (.*?)\|<REQ MSISDN="(.*?)" CONTRACT="(.*?)" SUBSCRIPTION="(.*?)" FORMAT="(.*?)" THRESHOLDID="(.*?)" TEXT="(.*?)"/) 

else分支相同。

+0

謝謝,它解決了這個問題。 – 2013-03-02 22:19:33

1

變化

(.*?) 

([a-zA-Z0-9]*) 
+0

這將使他'1362224754632 ;;;;;',而不是僅僅'';;;;;,但止跌」 t修復非轉管問題。儘管如此,這仍然是一個很好的建議。 – 2013-03-02 22:03:18

3

我不是使用一個正則表達式,而是先將數據拆分成不同的部分,然後再分別處理它們。

my($usms_part, $request) = split/\s* \|<REQ \s* /x, $Record; 

my($usms_id) = $usms_part =~ /^USMS (\d+)$/; 

my %request; 
while($request =~ /(\w+)="(.*?)"/g) { 
    $request{$1} = $2; 
} 

而不必硬編碼所有可能的鍵/值對,和他們可能的排序,你可以在一般一段代碼解析。

+0

我也會遵循這種方法。 – snoofkin 2013-03-03 17:08:02

+0

@Schwern - 我提出了你的答案。如果在數據文件中更改了任何鍵,則原始正則表達式將失敗 - 這包括:鍵的順序,鍵的拼寫和鍵數。最好有一個更開放(或通用?)捕獲鍵/值對,以應對未來的變化。並存儲在索引散列,好添加。雖然我會爲第一級關鍵字使用某種形式的'記錄號':'$ request {$ rnum} {$ 1} = $ 2;'' – 2013-03-03 02:31:19

0

它看起來像所有你想要的是雙引號中包含的字段。

,看起來像這樣

use strict; 
use warnings; 

while (<DATA>) { 
    my @values = /"([^"]+)"/g; 
    print join(';', @values), "\n"; 
} 

__DATA__ 
USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="AAA" FORMAT="ascii" TEXT="L2" 
USMS 1362224754632|<REQ MSISDN="00966590832186" CONTRACT="580" SUBSCRIPTION="BBB" THRESHOLDID="1" FORMAT="ascii" TEXT="L2" 

輸出

00966590832186;580;AAA;ascii;L2 
00966590832186;580;BBB;1;ascii;L2