c# - 解析多行固定格式文本文件

标签 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 编码员

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

最佳答案

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

或者您可以使用通用词法分析器/解析器为您生成代码。维基百科有很长list . Gold解析器看起来是个不错的选择。

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

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

关于c# - 解析多行固定格式文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061324/

相关文章:

powershell - 使用 Start-Process 使用参数运行脚本 block 命令

c# - WP7 上的 JSON 序列化性能问题

c# - 使用 IComparable 进行反向排序

c# - Azure 配置的 APPINSIGHTS_INSTRUMENTATIONKEY 和 ApplicationInsights :InstrumentationKey? 有什么区别

objective-c - 无法在 NSManagedObject 类 'building' 上调用指定的初始值设定项

python - Maltparser 在 NLTK 中给出错误

parsing - 外部参照表 - 如果外部参照预告片之一具有/上一个 0 条目,如何恢复 PDF 文件

Powershell BitsTransfer 未完成

c# - Markdown 夏普/ Markdown .NET : How to retrieve non-formatted text from markdown?

powershell - 在使用桌面应用程序转换器将我的 win32 应用程序转换为 UWP 应用程序时,如何在 appxmanifest 的发布者名称中添加逗号