2012-01-30 44 views
5

我想在每一個「記錄」分佈在多條線路的固定格式的文本文件來分析一些數據,所以......解析多行固定格式的文本文件

MAILBOX: 10013  Created: 01/20/09 4:39 pm 
    MSGS: 0   UNPLAYED: 0   URGENT: 0   RECEIPT: 0 
    LCOS: RBC Standard : 20   FCOS: RBC Standard  : 20 
    GCOS: Default GCOS 1 : 1    NCOS: Default   : 1 
    TCOS: Default TCOS 1 : 1    RCOS:     : 1 
BAD LOGS: 0   LAST LOG: NEVER        MINS:  0.0 
    PASSWD: Y   TUTOR: N    DAY: M   NIGHT: M  
    NAME:         CODE: 
    EXTEN: 10013       INDEX: 0 
ATTEN DN:         INDEX: 0   
DISTRIBUTION LISTS WITH CHANGE RIGHTS: 
    all 
DISTRIBUTION LISTS WITH REVIEW RIGHTS: 
    all 

我之前使用過File Helpers作爲單行記錄,並且它非常有用。檢查它的文檔,它有一個MultiRecordEngine功能,但是這將意味着......

  • 每行一類... 不是問題
  • 計算每個固定格式的確切大小場... 痛苦和開放的錯誤
  • 邏輯來檢查每一行

和另外皺紋,我發現是在固定格式實際上是不固定,即有根據目標記錄不同格式的行,所以一些有21行,約22,23,24等

我已經發現一個Java平面文件解析庫,FFP ,但我是.NET,C#,PowerShell編碼器

是否有更好的方法來處理這種解析?

回答

4

你需要的是一個詞法分析器。您的記錄太大而無法使用單個正則表達式進行分析,因此您必須爲每行編寫一個正則表達式,並使用狀態機來驗證這些行按照正確的順序執行。

或者您可以使用通用詞法分析器/解析器爲您生成代碼。維基百科長期有listGold解析器看起來很不錯。

我不會嘗試在PowerShell中進行lexing/parsing。我寧願將代碼編寫爲C#或F#,並使用PowerShell中的程序集。

編輯:我剛纔看過FileHelpers庫。您可以使用與您源記錄中的每行匹配的.NET類型創建一個Multirecord Engine。您所要做的就是解析結果數組以獲得有效順序並創建對象。

+0

感謝您的答覆......哦!這是比我想象的要複雜得多:-( – SteveC 2012-01-30 09:23:49

+0

Yeap,這是我要去的方向,但我希望有一個更簡單的解決方案。 – SteveC 2012-01-30 10:57:46