解析多行固定格式文本文件

时间:2012-01-30 08:50:15

标签: c# parsing powershell

我正在尝试解析固定格式文本文件中的一些数据,其中每个“记录”分布在多行上,如此......

 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编码器

有没有更好的方法来处理这种解析?

2 个答案:

答案 0 :(得分:4)

你需要的是词法分析器。您的记录太大而无法使用单个正则表达式进行解析,因此您必须为每一行编写一个正则表达式,并使用状态机来验证这些行的顺序是否正确。

或者您可以使用通用词法分析器/解析器为您生成代码。维基百科很长listGold解析器看起来很合适。

我不会尝试在PowerShell中进行lexing / parsing。我宁愿将代码编写为C#或F#,并使用PowerShell中的程序集。

编辑:我刚刚查看了FileHelpers库。您可以使用与您的源记录中的每一行匹配的.NET类型创建Multirecord Engine。然后,您只需解析结果数组以获得有效的顺序并创建对象。

答案 1 :(得分:3)

我在powershell中做了类似的事情,发现在here-string中使用正则表达式更容易使用:

http://mjolinor.wordpress.com/2012/01/05/powershell-multiline-regex-matching/