【问题标题】:How to compare two text files with value in ruby如何将两个文本文件与ruby中的值进行比较
【发布时间】:2014-03-03 02:22:16
【问题描述】:

我有两个文本文件,它们有一个相同的字段(宠物)。我想合并两个文件并输出一个包含三个字段的新文件(所有者宠物购买者)。我的代码主要取决于两个文件是否具有相同的宠物(宠物的名称和数量),而不是我将买方名称添加到新文件中的买方字段中。只有当两个文件具有相同的pet文件时才应该打印出来。

但是我的代码没有按我的意愿运行,需要一些帮助,谢谢。

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

【问题讨论】:

  • “猫,狗”和“狗,猫”有区别吗?那是什么意思?此外,您拆分了“\t”字符,但它出现在您的输入文件中的什么位置?仅在所有者/购买者姓名之后,还是在“猫”和“狗”之间?
  • 是的,我的两个文件都已按 A-Z 排序。 “\t”字符出现在所有者/购买者、“猫”和“狗”之后。

标签: ruby hash compare text-files readlines


【解决方案1】:

我建议你使用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

【讨论】:

  • 对了,这里的+=是什么意思?
  • 哈希中的值是数组。要将项目添加到数组中,我将包含单个项目的数组添加到哈希中的当前数组:a = [1];a += [2];a #=> [1,2]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2019-08-02
  • 2019-05-13
  • 2023-01-21
相关资源
最近更新 更多