使用ruby比较两个文本文件并打印一个索引为second的内容

时间:2018-02-12 17:41:28

标签: ruby text compare

我有两个文件:一个有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 |
  印刷> =如果line =〜/ reg /

,则为true      

如果打印则放置行

     如果line =〜/ Complete /

,则

打印= false      

但是each_line不能读取我的/ reg / ..但是如果我插入/ name1 /而不是我得到了我想要的输出..我该怎么办?谢谢你的帮助

1 个答案:

答案 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个值,这是一个强大的长正则表达式,我只是试图回避超长的正则表达式。这可能更具性能或正则表达式,您可以将它们与您的实际用例进行比较(对于您给我们的这个小样本,没有任何有意义的差异)