通过ruby将csv加载到hash中,然后从hash中选择元素

时间:2012-07-09 02:55:18

标签: ruby csv hash load

我今天正在学习ruby,并且无法从哈希中提取单个元素。

login1.csv

role,uName,passwd
adm,admin1,a1
mgr,manager,m
user,user1,u1
adm,admin2,a2

红宝石代码

def csvIntoHash
  # load csv Into hash
  $table = []
  File.open("logIn1.csv") do|f|
    columns = f.readline.chomp.split(',')
    until f.eof?
      row = f.readline.chomp.split(',')
      row = columns.zip(row).flatten #build hash from array
      $table << Hash[*row]
    end
  end
end
#
#main
csvIntoHash
#pulls all hash elements when role=mgr
puts $table.select {|rEntry| rEntry["role"]=="mgr"} 

如何在role = mgr时仅提取uName,然后将其分配给变量?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

select()返回一个数组,所以请看第一个(仅在你的情况下?)条目,这是你构造它时的哈希:

mgrh = $table.select {|rEntry| rEntry["role"]=="mgr"}
mgr_role = mgrh.first["uName"] # => "manager"

答案 1 :(得分:0)

您应该查看CSV library in Core

根据您在这里的CSV格式,如果您真正希望它获得经理的uName,我有以下解决方案。

manager = ""
CSV.read("file.csv").each_with_index do |arr, index|
  role_column = arr.index("role") if index == 0
  if arr[role_column.to_i] == "mgr"
    manager = arr[role_column.to_i + 1]
  end
end

修改
显然,这个问题在CSV表格中只有一个管理员。如果需要,您可以修改代码以分配管理器数组。