2009-07-09 5 views
2

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

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 элементы данных.

Приветствия, Dan

+0

Спасибо, ребята, - распаковка делает работу отлично. Ура! – dkam

ответ

9

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

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

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

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

См the documentation для описания упаковки/распаковки формата.

0

Существует несколько вариантов, как обычно.

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

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

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(), будет варьироваться в зависимости от длины поля на разных типах записей, и код будет зависеть на то, что вам нужны конечные пробелы и т. д. См. unpack reference.

Смежные вопросы