我有两个文件:一个有100个值的索引,另一个包含很多信息我想从我的索引文件中提取信息。例如:
FILE1.TXT
-name1
-name2
-name3
File2.txt:
Read id: name1
sometext
sometext
Complete
Read id: name8 (not index)
sometext
sometext
Complete
Read id: name2
sometext
sometext
Complete
所以我希望打印出像这样的输出
结果:
Read id: name1
sometext
sometext
Complete
Read id: name2
sometext
sometext
Complete
所以我的代码是:
f = open(“file1.txt”)。readlines()
v = []
表示f中的行 v.push(行[0 ..- 2])结束
reg = Regexp.new(v.join(“”))
printing = false
File.open(“file2.txt”)。each_line do | line |
,则为true
印刷> =如果line =〜/ reg /如果打印则放置行
如果line =〜/ Complete / ,则打印= false
端
但是each_line不能读取我的/ reg / ..但是如果我插入/ name1 /而不是我得到了我想要的输出..我该怎么办?谢谢你的帮助
答案 0 :(得分:0)
我认为您的主要问题是,您要包含第一个文件中的破折号,并且您要使用空字符串而不是正则表达式|
加入,而不是删除空字符串。您也只是与文字正则表达式/reg/
匹配,而不是变量reg
。
对于代码的最小更改,您可以使用以下方法使其工作:
f = open("file1.txt").readlines()
v=[]
for line in f
v.push(line[1..-2]) # changed this line
end
reg = Regexp.union(v.reject(&:empty?)) # changed this line
printing = false
File.open("file2.txt").each_line do |line|
printing = true if line =~ reg # changed this line
puts line if printing
printing = false if line =~ /Complete/
end
您还可以使用其他几种更简洁,更简洁的方法执行此操作,例如:
v = File.open("file1.txt").each_line.with_object([]) do |line, v|
line = line[/-(\w+)/, 1]
v << line if line
end
File.open("file2.txt").each_line do |line|
if v.include?(line[/Read id: (\w+)/, 1])..(line.match?(/Complete/))
puts line
end
end
这种方法利用字符串方法#[regexp, capture]
来拉出我们对行感兴趣的字符串部分。并且还使用模糊的flip-flop operator,它总是计算为false,直到它匹配第一个条件,然后它总是计算为true,直到它匹配第二个条件,当它再次开始评估为false时(直到它匹配第一个条件)再次)。我也从使用正则表达式切换到匹配线到输出只是检查数组中是否包含Read id:
值。有了你要检查的100个值,这是一个强大的长正则表达式,我只是试图回避超长的正则表达式。这可能更具性能或正则表达式,您可以将它们与您的实际用例进行比较(对于您给我们的这个小样本,没有任何有意义的差异)