【问题标题】:Input CSV via ruby into hash than selecting same vaule from hash通过 ruby​​ 将 CSV 输入到哈希中,而不是从哈希中选择相同的值
【发布时间】:2014-02-17 21:39:14
【问题描述】:

我最近正在学习 Ruby,我想知道我是否可以通过 ruby​​ 将 CSV 输入到哈希中(每一行都是一个哈希),而不是从每个哈希中选择相同的值,如果有任何值匹配而不是打印所有相同值的键。

test.csv

人名,出生地

印第安纳州玛丽

约翰,芝加哥

肖恩,印第安纳州

杰森,纽约

莫妮卡,芝加哥

ruby 代码(尚未完成)

require 'csv' 
input_file = ARGV[0]
hash = {}
CSV.foreach(input_file, headers: true) do |row|
  row.each do |line|
    person_name, birth_place = line.chomp.split(",")
    hash[person_name] = birth_place
  end
end

结果应该是这样的:

[{印第安纳 => “玛丽”,“肖恩”}, {芝加哥 => “约翰”,“莫妮卡”}]

有什么建议或模型吗? 感谢您的帮助。

【问题讨论】:

    标签: ruby csv hash compare


    【解决方案1】:

    在这种情况下,您似乎不需要CSV:

    hash = {}
    input_file = ARGV[0]
    File.new(input_file).readlines.each { |line|
      next if line =~ /birth_place/ # ignore headers
      name, bp = line.chomp.split(',')
      (hash[bp] ||= []) << name # create an array if it does not exist yet
    }
    
    puts hash
    
    
    # ⇒ {"Indiana"=>["Mary", "Sean"], "Chicago"=>["John", "Monica"], "New york"=>["Jason"]}
    

    希望对你有帮助。

    【讨论】:

    • 感谢您帮助我。我尝试了您的代码并使用 txt 文件而不是 csv 文件,我得到的结果为 # {} (与我们相同,我使用 csv.file)有什么想法吗?谢谢
    • 您应该提供一个 CSV 文件作为输入,因为我的代码依赖逗号作为分隔符。要使用文本文件,您应该将拆分更改为name, bp = line.chomp.split(' ', 2)(拆分为两部分,使用空格作为分隔符。)
    • 你会把puts "Line: #{line}"这一行放在循环体的开头(next if …之前)并把执行结果复制到这里吗?
    • 结果如下:Monica,Chicagokme,birth_place {}
    猜你喜欢
    • 2014-03-02
    • 2012-07-08
    • 2018-04-24
    • 2013-07-23
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多