Сравнение строк из двух больших массивов для печати - PullRequest
0 голосов
/ 13 января 2020

Начинающий с Ruby здесь.

У меня есть два текстовых файла, FILE1.txt и FILE2.txt (3 ГБ). Я пытаюсь взять каждое из имен регистров из FILE1.txt, чтобы найти ключевые слова, которые похожи на FILE2.txt, поскольку он содержит пути к нужным мне регистрам.

Например:

FILE1.txt:

STRING_THAT_MATCHES_FILE1
STRING_THAT_DOES_NOT_MATCH
STRING_THAT_DOES_NOT_MATCH_2

3 ГБ текста FILE2.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"]

Ответы [ 2 ]

1 голос
/ 13 января 2020

Расходы на ответ Алексея Матюшкина . Я хотел бы go с версией, которая выглядит немного иначе:

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    6067d88dh\n"}

Если вы не заинтересованы в индексах, а только в самих строках, вы можете упростить приведенное выше до:

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    6067d88dh\n"]

Если вам не нужен / не нужен завершающий символ новой строки в конце строки, измените File.foreach('FILE2.txt') на File.foreach('FILE2.txt', chomp: true).

1 голос
/ 13 января 2020

Должно работать что-то вроде ниже.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...