Ruby 的初学者在这里。
我有两个文本文件,FILE1.txt 和 FILE2.txt(3GB(。我正在尝试从 FILE1 中获取每个寄存器名称.txt以查找类似于 FILE2 的关键字.txt因为它包含我需要的寄存器路径。
例如:
文件1.txt:
STRING_THAT_MATCHES_FILE1
STRING_THAT_DOES_NOT_MATCH
STRING_THAT_DOES_NOT_MATCH_2
3GB 文本文件2.txt:
SYS.abcd.abcd.abcd.STRING_THAT_MATCHES_FILE1 6067d88dh
SYS.efgh.ijkl.abcd.doesnt_match 0h
当我尝试比较文件(如以下代码(时,我得到空数组
$: << File.join( File.dirname(__FILE__), 'Ruby' )
require 'csv'
require 'etc'
require 'timeout'
require 'date'
require 'set'
paths_file = 'FILE2.txt'
register_file = 'FILE1.txt'
register_array = Array.new
paths_array = Array.new
compared = Array.new
File.foreach(register_file).with_index do |regs|
register_array << regs
File.foreach(paths_file).with_index do |paths|
paths_array << paths
if regs.include? paths
compared << paths
print compared
end
end
end
这是我得到的输出:
["n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n"]
根据阿列克谢·马蒂乌什金的回答。我会选择一个看起来有点不同的版本:
register_names = File.readlines('FILE1.txt', chomp: true)
register_names_regex = Regexp.union(register_names)
found_registers = File.foreach('FILE2.txt').with_index
.select { |line, _index| line.match?(register_names_regex) }
.to_h(&:reverse)
#=> {0=>"SYS.abcd.abcd.abcd.STRING_THAT_MATCHES_FILE1 6067d88dhn"}
如果您对索引不感兴趣,而只对行本身感兴趣,您可以将上述内容简化为:
register_names = File.readlines('FILE1.txt', chomp: true)
register_names_regex = Regexp.union(register_names)
found_registers = File.foreach('FILE2.txt').grep(register_names_regex)
#=> ["SYS.abcd.abcd.abcd.STRING_THAT_MATCHES_FILE1 6067d88dhn"]
如果您不想/不需要行尾的终止换行符,请将File.foreach('FILE2.txt')
更改为File.foreach('FILE2.txt', chomp: true)
。
像下面这样的东西应该可以工作。
matchers = Regexp.union(File.readlines('FILE1.txt'), chomp: true)
File.foreach('FILE2.txt').with_index.with_object({}) do |(e, idx), h|
h[idx] = e if e =~ matchers
end