【问题标题】:Ruby: how to push to a hash inside an array on a CSVRuby:如何推送到 CSV 数组内的哈希值
【发布时间】:2016-05-16 02:09:56
【问题描述】:

我是红宝石新手。 我有两个 csv 文件,我正在使用“csv”库。我可以从 CSV 中获取数组,但我不知道如何推送到第一个 csv 中的哈希。

我从 CSV 中得到这两个数组:

csv1 = [1,2,{3 => :a},4]
csv2 = [5,6,{7 => :b},8]

我希望第一个 csv 文件看起来像这样:

[1,2,{3 => :a, 7 => :b},4]

【问题讨论】:

  • 请阅读“How to Ask”。 SO 不是为您编写代码,而是帮助调试您编写的代码的问题。我们希望您研究,尝试,然后询问您是否无法弄清楚。请阅读meta.stackoverflow.com/q/261592/128421。我们需要看到能证明问题的最小样本输入数据。 [1,2,{3 => a, 7 => b},4] 不是有效的 CSV,因为有嵌入的逗号,并且 CSV 格式没有右括号,所以请解释一下。
  • 我很欣赏这个绿色,但我建议你收回它,至少暂时是这样。快速选择可能会阻止其他可能更好的答案,并且推迟一段时间是对那些仍在准备答案的人的礼貌。我的建议是在选择答案之前至少等待几个小时。不用着急,只要你得到至少一个有用的答案就不要忘记。
  • 你想用两个数组做一些事情。数组的来源无关紧要。
  • 好的。我会考虑两个 cmets。下次我将等待更长的时间来绿色响应,而不是试图“抽象”问题,我将展示代码本身。再次感谢!。
  • 代码,就像一张图片,值10_000字。

标签: arrays ruby csv hash


【解决方案1】:

这是一种方式。

arr1 = [1,2,{ 3 => 'a' },4]
arr2 = [5,6,{ 7 => 'b' },8]

arr1.map do |e|
  case e
  when Hash then e.merge(arr2.select { |e| e.is_a? Hash }.first)
  else e
  end
end
  #=> [1, 2, {3=>"a", 7=>"b"}, 4] 

什么时候

e #=> { 3 => 'a' }

h2 = arr2.select { |e| e.is_a? Hash }.first
  #=> [{ 7 => 'b' }].first
  #    { 7 => 'b' }
e.merge(arr2.select { |e| e.is_a? Hash }.first)
e.merge(h2)
  #=> { 3 => 'a' }.merge({ 7 => 'b' })
  #=> {3=>"a", 7=>"b"}

【讨论】:

  • 一如既往,一个很酷的答案...但arr1.each_with_index.map do |e, index| 不是更好吗?它提供arr2 的索引,并处理多个哈希数组值(而不仅仅是第一个)
  • @Steve,我不知道这两个哈希是否一定在相同的偏移量。
【解决方案2】:

这里还有另一种方法:

csv1.zip(csv2).collect{|v1, v2| v1.merge(v2) rescue v1 }

我们首先使用zip组合两个数组

csv1 = [1,2,{3 => :a},4]
csv2 = [5,6,{7 => :b},8]

t = csv1.zip(csv2)
#=> [[1, 5], [2, 6], [{3=>:a}, {7=>:b}], [4, 8]]

接下来,我们收集合并子数组的两个元素的结果。然而,由于 merge 仅在 Hash 上受支持,如果在 Fixnum 上调用它,我们预计会出现异常,例如 12 - 在这种情况下,我们将通过返回 first 的值从异常中解救出来数组元素。

t = t.collect{|v1, v2| v1.merge(v2) rescue v1 }
#=> [1, 2, {3=>:a, 7=>:b}, 4]

Array#mapArray#collect 的别名 - 可以根据自己在代码上下文中的偏好及其可读性使用其中任何一种

【讨论】:

  • @SteveTurczyn 谢谢
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 2017-11-30
  • 2016-01-10
  • 2013-02-13
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
相关资源
最近更新 更多