我正在尝试通读文件,找到某个模式,然后在包含该模式的行之后抓取一定数量的文本行。不确定如何处理这个问题。
答案 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)
(唯一的区别是我生成文件对象的方式)
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
哈哈,我已经说了太多,绝对应该让你开始