Ruby文件解析每条记录x行

时间:2013-07-09 12:23:34

标签: ruby

我有一个要解析的文本文件。在此文件中,每条记录的内容分布在可变数量的行中。每条记录的行数不是固定数。该文件的内容如下所示:

ID\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
ID\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
ID\tcontent\tcontent
\tcontent\tcontent

我想在第一个标签栏中有记录的地方切片(ID列在以下行中为空,因此确定新记录的方式应该有效)。

我目前的代码是将它分成五行的块然后合并它:

f = File.read(file).each_line
f.each_slice(5) do | slice_to_handle |
  merged_row = slice_to_handle.delete("\n").split("\t").collect(&:strip)
  # Dealing with the data here..
end

我需要修改它,以便在第一列中设置ID后立即对其进行切片。

2 个答案:

答案 0 :(得分:0)

File.read(file)
.split(/^(?!\t)/)
.map{|record| record.split("\t").map(&:strip)}

结果

[
  [
    "ID",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content"
  ],
  [
    "ID",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content",
    "content"
  ],
  [
    "ID",
    "content",
    "content",
    "content",
    "content"
  ]
]

答案 1 :(得分:0)

Ruby的Array继承自Enumerable,它有slice_before,这是你的朋友:

text_file = "ID\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
ID\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
\tcontent\tcontent
ID\tcontent\tcontent
\tcontent\tcontent".split("\n")

text_file.slice_before(/^ID/).map(&:join) 

看起来像:

[
  "ID\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent",
  "ID\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent\tcontent",
  "ID\tcontent\tcontent\tcontent\tcontent"
]

text_file是一系列行,类似于使用readlines生成文件时所获得的行。

slice_before遍历数组,寻找与/^ID/模式的匹配,并在每次找到时创建一个新的子数组。

map(&:join)遍历子数组并将其内容连接成一个字符串。

但这不是很容易扩展。使用它,你将依赖于能够将整个文件啜饮到内存中,这可以阻止机器跟踪它。相反,最好逐行阅读内容并打破块并尽快处理它们。