Как мне разобрать файл записи фиксированной длины в Ruby? - PullRequest
2 голосов
/ 09 июля 2009

Мне было интересно, есть ли у кого-нибудь совет по синтаксическому анализу файла с записями фиксированной длины в Ruby. Файл имеет несколько разделов, каждый раздел имеет заголовок, n элементы данных и нижний колонтитул. Например (Это полная чушь, но содержание примерно одинаковое)

1923  000-230SomeHeader     0303030 
209231-231992395    MoreData
293894-329899834    SomeData
298342-323423409    OtherData
3     3423942Footer record  9832422

В этом примере строки заголовков, нижних колонтитулов и данных начинаются с определенного числа (1,2 и 3).

Я посмотрел на http://rubyforge.org/projects/file-formatter/, и это выглядит хорошо - за исключением того, что документация легкая, и я не вижу, как получить n элементов данных.

Cheers, Dan

Ответы [ 2 ]

9 голосов
/ 09 июля 2009

Есть несколько способов сделать это. unpack метод string может использоваться для определения структуры полей следующим образом: -

"209231-231992395    MoreData".unpack('aa5A1A9a4Z*')

Возвращает массив следующим образом: -

["2", "09231", "-", "231992395", "    ", "MoreData"]

См. документацию для описания формата упаковки / распаковки.

0 голосов
/ 09 июля 2009

Несколько опций существуют как обычно.

Если вы хотите сделать это вручную, я бы предложил что-то вроде этого:

очень псевдокод:

Read file
while lines in file
    handle_line(line) 
end

def handle_line
    type=first_char
    parse_line(type)
end

def parse_line
    split into elements and do_whatever_to_them
end

Разделение строки на элементы с фиксированным значением может быть выполнено, например, unpack()

irb(main):001:0> line="1923  000-230SomeHeader     0303030"
=> "1923  000-230SomeHeader     0303030"
irb(main):002:0* list=line.unpack("A1A5A7a15A10") 
=> ["1", "923", "000-230", "SomeHeader     ", "0303030"]
irb(main):003:0> 

Шаблон, используемый для unpack(), будет варьироваться в зависимости от длины поля для различных типов записей, и код будет зависеть от того, хотите ли вы использовать конечные пробелы и тому подобное. Подробнее см. ссылка на распаковку .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...