解析特定数量的行

时间:2010-07-11 04:29:47

标签: ruby file-io

我正在尝试通读文件,找到某个模式,然后在包含该模式的行之后抓取一定数量的文本行。不确定如何处理这个问题。

5 个答案:

答案 0 :(得分:1)

首先将文件解析为行。在换行符上打开,阅读,拆分

lines = File.open(file_name).read.split("\n")

然后获取索引

index = line.index{|x| x.match(/regex_pattern/)}

其中regex_pattern是您要查找的模式。使用索引作为起点,然后第二个参数是行数(在本例中为5)

lines[index, 5]

它将返回'lines'数组

您可以将它组合一点以减少行数。但我试图让它保持可读性。

答案 1 :(得分:1)

如果你没有与Ruby绑定,grep -A 12 trivet将在任何包含trivet的行之后显示12行。任何正则表达式都将取代“trivet”

答案 2 :(得分:1)

如果您希望文件n中与pattern行匹配后的filename行数:

lines = File.open(filename) do |file|
  line = file.readline until line =~ /pattern/ || file.eof;
  file.eof ? nil : (1..n).map { file.eof ? nil : file.readline }.compact
end

这应该处理所有情况,例如文件中不存在的模式(返回nil)或匹配行后面的行数少于n(结果数组包含最后一行文件)。

答案 3 :(得分:0)

matched = false;
num = 0;
res = "";

new File(filename).each_line { |line|
    if (matched) {
        res += line+"\n";
        num++;
        if (num == num_lines_desired) {
            break;
        }
    } elsif (line.match(/regex/)) {
        matched = true;
    }

}

这样做的好处是不需要在匹配的情况下读取整个文件。

完成后,res将保留所需的行。

答案 4 :(得分:0)

在rails中

(唯一的区别是我生成文件对象的方式)

file = File.open(File.join(Rails.root, 'lib', 'file.json'))

 #convert file into an array of strings, with \n as the separator

 line_ary = file.readlines
 line_count = line_ary.count

 i = 0
  #or however far up the document you want to be...you can get very fancy with this or just do it manually

 hsh = {} 
 line_count.times do |l|
    child_id = JSON.parse(line_ary[i])
    i += 1
    parent_ary = JSON.parse(line_ary[i])
    i += 1
    hsh[child_id] = parent_ary
  end
哈哈,我已经说了太多,绝对应该让你开始