0

读取 csv 文件后,我有以下数据结构:

[["name1 | value1 | value2 | value3 | value4 "],
 ["name2 | value1 | value2 | value3 | value4 "],...]

我需要将其转换为哈希,如下所示:

{"name1" => "value1 | value2 | value3 | value4", 
 "name2" => "value1 | value2 | value3 | value4",...}

或者,更好的是:

{"name1" => ["value1","value2","value3","value4"],
 "name2" => ["value1","value2","value3","value4"],...}

我找到了许多将数组数组转换为哈希的方法,但没有一种方法将内部数组中的第一个元素用作哈希的键。

谁能提出一个优雅的解决方案?

4

4 回答 4

2
rows = [["name1 | value1 | value2 | value3 | value4 "],
        ["name2 | value1 | value2 | value3 | value4 "],]

h = Hash[
   rows.flatten.
   map { |r| r = r.split('|').map(&:strip); [r.first, r.drop(1)] }
]

# => {"name1"=>["value1", "value2", "value3", "value4"],
#     "name2"=>["value1", "value2", "value3", "value4"]}

我有点好奇你是如何得出那个输入结构的。如果您阅读带有分隔符“|”的 CSV,您可能会从以下内容开始:

[["name1", "value1", "value2", "value3", "value4"],
 ["name2", "value1", "value2", "value3", "value4"]]

这就是r = r.split('|').map(&:strip)外部地图中要转换的内容。如果您确实有这种形式,则转换为哈希会简单得多:

Hash[ rows.map { |r| [r.first, r.drop(1)] } ]
于 2013-04-12T20:11:26.390 回答
1

除了@dbenhur 的回答。假设 CSV 类可以处理分隔符,并且您得到一个基本结构,例如:

rows = [["name1", "value1", "value2", "value3", "value4"],
        ["name2", "value1", "value2", "value3", "value4"]]

您可以使用 splat 运算符对其进行转换:

Hash[rows.map { |name, *values| [name, values] }]
# => {"name1"=>["value1", "value2", "value3", "value4"], "name2"=>["value1", "value2", "value3", "value4"]}
于 2013-04-13T06:37:47.547 回答
0

你可以试试这个:

csv.inject({}) do |memo, item|
    parts = item.first.split('|').map(&:strip)
    memo[parts.first] = parts.slice(1,parts.size)
    memo
end

给你{"name1" => ["value1","value2","value3","value4"], "name2" => ["value1","value2","value3","value4"],...}

附带说明一下,每当我编写代码时,memo[parts.first] = parts.slice(1,parts.size)我真的希望 Ruby 只添加一个headandtail方法。

于 2013-04-13T10:43:42.117 回答
0
def to_hash(a)
  h = {}
  a.each do |item|
    a2 = item.first.strip.split(' | ')
    h[a2.shift] = a2
  end
  h
end

用法:

a = [["name1 | value1 | value2 | value3 | value4 "],
     ["name2 | value1 | value2 | value3 | value4 "]]
to_hash(a)
# => {"name1"=>["value1", "value2", "value3", "value4"],
#     "name2"=>["value1", "value2", "value3", "value4"]}
于 2013-04-12T20:05:31.213 回答