2010-03-17 2 views
2

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

+1 за не вызывая Ктулху. –

ответ

2

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

Другой вариант - использовать OFX gem. Драгоценный камень анализирует файлы OFX. Поскольку ваш файл находится в формате MT940, вам необходимо преобразовать файл в формат OFX, используя один из доступных бесплатных конвертеров. Такой подход является практичным, если вы импортируете в качестве пакетного задания и т.д.

Reference

MT940 Java parser.

MT940 to OFX Converter 1

MT940 to OFX Converter 2

+0

спасибо, первый конвертер является .exe, поэтому я как * nix Person будет идти на Java-решения и адаптировать его к рубину – Beffa