2014-02-06 5 views
0

У меня есть два текстовых файла, и у них есть одно и то же поле (домашнее животное). Я хочу объединить два файла и вывести новый файл, содержащий три поля (владелец домашних животных). Мой код в основном зависит от того, есть ли у обоих файлов одинаковое домашнее животное (имя и количество домашних животных), чем я добавлю имя покупателя в поле покупателя в новом файле. Он должен распечатываться только в том случае, если два файла имеют одинаковые файлы с домашним животным.Как сравнить два текстовых файла со значением в ruby ​​

Но мой код не работал, как я хочу, нужна помощь, спасибо.

input_file_1 (.txt)

owner pet 
Michael dog, cat 
John pig, rabbit 
Marry dog, cat 

input_file_2 (.txt)

buyer pet 
Sean cat, dog 
Mark cat, dog 
Joy dog, mouse 
Tina cat, dog 

Я хочу, чтобы результат выглядел так:

owner pet buyer 
Michael cat, dog Sean, Mark, Tina 
Mary cat, dog Sean, Mark, Tina 

Мой код выглядит следующим образом:

input_file_1 = ARGV[0] 
input_file_2 = ARGV[1] 

hash_1 = {} 
File.readlines(input_file_1, "\n").each do |line| 
    owner, pet = line.chomp.split("\t") 
    hash_1[owner] = pet 
end 

hash_2 = {} 
File.readlines(input_file_2, "\n").each do |line| 
    buyer, pet = line.chomp.split("\t") 
    hash_2[buyer] = pet 
end 

hash_1.each do |key, value| 
    if hash_2.has_value? value 
    puts "#{key}\t#{value}\t#{hash_2[key]}" 
    end 
end 
+0

Есть ли разница между «кошкой, собакой» и «собаками, кошками»? Что это значит? Кроме того, вы разделяете символ «\ t», но где он отображается в ваших входных файлах? Только после имени владельца/покупателя, а также между «кошкой» и «собакой»? –

+0

Да, оба файла уже отсортированы как A-Z. Символ «\ t» появляется после владельца/покупателя «кошка» и «собака». – Michael

ответ

0

Я хотел бы предложить вам использовать pet как ключ:

input_file_1 = ARGV[0] 
input_file_2 = ARGV[1] 

hash_1 = Hash.new([]) 
File.readlines(input_file_1, "\n").each do |line| 
    owner, pet = line.chomp.split("\t") 
    hash_1[pet] += [owner] 
end 

hash_2 = Hash.new([]) 
File.readlines(input_file_2, "\n").each do |line| 
    buyer, pet = line.chomp.split("\t") 
    hash_2[pet] += [buyer] 
end 

hash_1.each do |pet, owners| 
    if hash_2.include? pet 
    owners.each do |owner| 
     puts "#{owner}\t#{pet}\t#{hash_2[pet].join(", ")}" 
    end 
    end 
end 
+0

Вижу, спасибо, много работает. – Michael

+0

, кстати, что делает + = означает здесь? – Michael

+0

Значения в хешах представляют собой массивы. Чтобы добавить элемент в массив, я добавляю массив с одним элементом в текущий массив в хеше: 'a = [1]; a = = [2]; a # => [1,2]' –

Смежные вопросы