我想知道是否有人对在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 数据元素。
干杯, 丹
答案 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。