2012-01-30 46 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