我正在尝试解析固定格式文本文件中的一些数据,其中每个“记录”分布在多行上,如此......
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编码器
有没有更好的方法来处理这种解析?
答案 0 :(得分:4)
你需要的是词法分析器。您的记录太大而无法使用单个正则表达式进行解析,因此您必须为每一行编写一个正则表达式,并使用状态机来验证这些行的顺序是否正确。
或者您可以使用通用词法分析器/解析器为您生成代码。维基百科很长list。 Gold解析器看起来很合适。
我不会尝试在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/