Я предполагаю, что каждая строка в файле 1 содержится не более чем в одной строке в файле 2, и каждая строка файла 2 содержит не более одного языка в файле 1, что соответствует примеру, приведенному в вопросе.
Давайте сначала создадим файлы.Чтобы сделать жизнь более интересной, я изменил содержимое обоих файлов, приведенных в вопросе.
file1 =<<-END
Ruby
C
Visual Basic
C++
R
Objective-C++
Basic
HTML
END
FName1 = 'file1'
File.write(FName1, file1)
#=> 51
file2 =<<-END
5. ab cde fg Java hij kl
2. ab PHP dddf llf
4. cde fg z o Objective-C++ oode
8. a12b cde JavaScript kdk
6. ab99r cde Visual Basic llso dkd
1. lkd dsk Ruby kksdk
3. Python dsdls
7. kdjd C jdjd
9. CSS dkdsk
10. blah C++ blah
7. kkd Basic jjs
3. rooor R kdk
END
FName2 = 'file2'
File.write(FName2, file2)
#=> 256
Сначала прочитайте строки FName1
в массив.
languages = File.readlines(FName1, chomp:true)
#=> ["Ruby", "C", "Visual Basic", "C++",
# "R", "Objective-C++", "Basic", "HTML"]
Теперь для удобства,порядок элементов languages
уменьшается по длине.
sorted_languages = languages.sort_by(&:length).reverse
#=> ["Objective-C++", "Visual Basic", "Basic",
# "Ruby", "HTML", "C++", "C", "R"]
Я отсортировал элементы languages
по уменьшению длины слова, чтобы попытаться сопоставить строку FName2
с 'Objective-C ++ будет выполнен до того, как будет предпринята попытка сопоставления с C ++, а C ++ будет рассмотрен до «C».Аналогично, «Visual Basic» будет рассматриваться как совпадение до «Basic».
Затем создайте хеш, ключами которого являются те строки в FName1
, которые появляются в строке FName2
и чьизначения - это хэши, определяющие номер строки и строку в FName2
для данного ключа.
language_to_file2 = File.foreach(FName2, chomp: true).
with_index(1).
with_object({}) do |(line,n),h|
language = sorted_languages.find { |language| line.include?(language) }
h[language] = { line: line, nbr: n } unless language.nil?
end
#=> {"Objective-C++"=>{:line=>"4. cde fg z o Objective-C++ oode", :nbr=>3},
# "Visual Basic" =>{:line=>"6. ab99r cde Visual Basic llso dkd", :nbr=>5},
# "Ruby" =>{:line=>"1. lkd dsk Ruby kksdk", :nbr=>6},
# "C" =>{:line=>"7. kdjd C jdjd", :nbr=>8},
# "C++" =>{:line=>"10. blah C++ blah", :nbr=>10},
# "Basic" =>{:line=>"7. kkd Basic jjs", :nbr=>11},
# "R" =>{:line=>"3. rooor R kdk", :nbr=>12}}
Теперь мы можем отобразить желаемый результат.
languages.each do |language|
print "#{language}|"
if language_to_file2.key?(language)
h = language_to_file2[language]
puts "%d|%s" % [h[:nbr], h[:line]]
else
puts "Not found"
end
end
Ruby|6|1. lkd dsk Ruby kksdk
C|8|7. kdjd C jdjd
Visual Basic|5|6. ab99r cde Visual Basic llso dkd
C++|10|10. blah C++ blah
R|12|3. rooor R kdk
Objective-C++|3|4. cde fg z o Objective-C++ oode
Basic|11|7. kkd Basic jjs
HTML|Not found