лучший способ проанализировать текстовый файл с вложенной информационной структурой

StackOverflow https://stackoverflow.com/questions/2459292

Вопрос

Текстовый файл содержит сотни таких записей (формат — выписка по счету 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)

но с рекурсией сложно...

Как я могу решить эту проблему?

Это было полезно?

Решение

Существует несколько парсеров MT940 с открытым исходным кодом, доступных на Java и PHP.Вы можете посмотреть исходный код и портировать его на Ruby.Если вы используете JRuby, вы можете использовать парсер Java в своем коде Ruby.

Другой вариант — использовать драгоценный камень ОФХ.Гем анализирует файлы OFX.Поскольку ваш файл имеет формат MT940, вам необходимо преобразовать его в формат OFX, используя один из доступных бесплатных конвертеров.Этот подход практичен, если вы импортируете пакетное задание и т. д.

Ссылка

Java-парсер MT940.

Конвертер MT940 в OFX 1

Конвертер MT940 в OFX 2

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top