我应该如何解析Ruby中的固定长度记录文件?

时间:2009-07-09 08:27:10

标签: ruby parsing

我想知道是否有人对在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 数据元素。

干杯, 丹

2 个答案:

答案 0 :(得分:9)

有很多方法可以做到这一点。 unpack method of string可用于定义字段模式,如下所示: -

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

这将返回一个数组,如下所示: -

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

有关打包/解包格式的说明,请参阅the documentation

答案 1 :(得分: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