【问题标题】:best way to parse plain text file with a nested information structure解析具有嵌套信息结构的纯文本文件的最佳方法
【发布时间】:2011-01-28 09:26:37
【问题描述】:

文本文件有数百个这样的条目(格式为 MT940 银行对账单)

{1:F01AHHBCH110XXX0000000000}{2:I940X           N2}{3:{108:XBS/091502}}{4:
:20:XBS/091202/0001
:25:5887/507004-50
:28C:140/1
:60F:C0914CHF7789,
:61:0912021202D36,80NTRFNONREF//0887-1202-29-941
04392579-0 LUTHY + xxx, ZUR
:86:6034?60LUTHY + xxxx, ZUR vom 01.12.09 um 16:28 Karten-Nr. 2232
2579-0
:62F:C091202CHF52,2
:64:C091302CHF52,2
-}

这应该进入一个哈希数组,如

[{"1"=>"F01AHHBCH110XXX0000000000"},
  "2"=>"I940X           N2", 
   3 => {108=>"XBS/091502"}
etc.
} ]

我在树顶上尝试过,但它似乎不是正确的方法,因为它更多的是用于您想要进行计算的东西,而我只是想要信息。

grammar Mt940

  rule document
    part1:string spaces [:|/] spaces part2:document 
    {
      def eval(env={})
        return part1.eval, part2.eval
      end
    }
    / string
    /  '{' spaces document spaces '}' spaces
    {
      def eval(env={})
        return [document.eval]
      end
    }
  end
end

我也尝试了正则表达式

matches = str.scan(/\A[{]?([0-9]+)[:]?([^}]*)[}]?\Z/i)

但是递归很难......

我该如何解决这个问题?

【问题讨论】:

  • +1 不召唤克苏鲁。

标签: ruby regex parsing treetop mt940


【解决方案1】:

在 Java 和 PHP 中有几个可用的开源 MT940 解析器。您可以查看源代码并将其移植到 Ruby。如果您使用的是 JRuby,那么您可以在您的 ruby​​ 代码中使用 java 解析器。

其他选项是使用OFX gem。 gem 解析 OFX 文件。由于您的文件是 MT940 格式,您必须使用可用的免费转换器之一将文件转换为 OFX 格式。如果您在批处理作业等中导入,这种方法很实用。

参考

MT940 Java parser.

MT940 to OFX Converter 1

MT940 to OFX Converter 2

【讨论】:

  • 谢谢,第一个转换器是一个 .exe,所以我作为一个 *nix 人会选择 java 解决方案并将其改编为 ruby​​
猜你喜欢
  • 2015-01-18
  • 2016-12-27
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
相关资源
最近更新 更多