代码之家  ›  专栏  ›  技术社区  ›  dkam

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

  •  2
  • dkam  · 技术社区  · 17 年前

    我想知道是否有人对用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 回复  |  直到 17 年前
        1
  •  9
  •   Sinan Ünür    17 年前

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

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

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

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

    见 the documentation 有关pack/unpack格式的说明。

        2
  •  0
  •   Knut Haugen    17 年前

    像往常一样,有几种选择。

    如果您想手动操作,我建议您这样做:

    非常伪代码:

    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
    

    例如,可以将行拆分为fixed with元素 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 reference 详情。

    推荐文章