【问题标题】:How do you convert an array of strings to an array of hashes? [closed]如何将字符串数组转换为哈希数组? [关闭]
【发布时间】:2013-12-09 08:37:21
【问题描述】:

下面是一个由两个字符串组成的数组。我想知道如何将其转换为包含两个哈希的数组。

["{:date=>\"11/24/13 12:39 PM\", :gross_profit=>32.5, :cogs=>9.75, :net_profit=>38.5, :units_sold=>5}",
   "{:date=>\"11/24/13 12:41 PM\", :gross_profit=>29.5, :cogs=>8.9, :net_profit=>34.2, :units_sold=>4}"]

我采取了不同的方法,并以不同的格式保存了 csv 文件,这使我能够更轻松地操作 ruby​​ 文件中的数据,因此不再需要打开这个问题。有人可以删除这个问题吗?当我发布问题时,我会尝试更具体(在有限的初学者知识允许的情况下)和彻底。很抱歉,感谢您的帮助。

【问题讨论】:

  • 给我们适当的数据..
  • 你不能。这不会被 Ruby 解析器接受。
  • 那不是 CSV。也不是 JSON。你从哪里得到它,你写了什么代码来尝试解决这个问题?
  • 我假设它是一个包含两个字符串的数组,s_jw 希望将其转换为哈希,在这种情况下,应该删除一个左括号和两个右括号。完成后,这个问题没有任何问题。 s_jw,我建议您进行编辑以避免吸引额外的反对票。
  • @CarySwoveland 感谢您的提示。那是从我的 IRB 复制和粘贴的,不确定是否与它有关。我是一个初学者,所以很难判断事物在哪里以及为什么按照它们的方式格式化,以及它是否正确或需要编辑。

标签: ruby string csv methods hash


【解决方案1】:

您首先要删除不平衡的右括号,然后在两个字符串上调用 eval 以将它们返回到哈希:

2.0.0p247 :010 > arr = [["{:date=>\"11/24/13 12:39 PM\", :gross_profit=>32.5, :cogs=>9.75, :net_profit=>38.5, :units_sold=>5}",
2.0.0p247 :011 >          "{:date=>\"11/24/13 12:41 PM\", :gross_profit=>29.5, :cogs=>8.9, :net_profit=>34.2, :units_sold=>4}"]]
 => [["{:date=>\"11/24/13 12:39 PM\", :gross_profit=>32.5, :cogs=>9.75, :net_profit=>38.5, :units_sold=>5}", "{:date=>\"11/24/13 12:41 PM\", :gross_profit=>29.5, :cogs=>8.9, :net_profit=>34.2, :units_sold=>4}"]] 

2.0.0p247 :013 > hash1, hash2 = arr.flatten.map {|str| eval(str)}
 => [{:date=>"11/24/13 12:39 PM", :gross_profit=>32.5, :cogs=>9.75, :net_profit=>38.5, :units_sold=>5}, {:date=>"11/24/13 12:41 PM", :gross_profit=>29.5, :cogs=>8.9, :net_profit=>34.2, :units_sold=>4}] 

2.0.0p247 :014 > hash1
 => {:date=>"11/24/13 12:39 PM", :gross_profit=>32.5, :cogs=>9.75, :net_profit=>38.5, :units_sold=>5} 

2.0.0p247 :015 > hash2
 => {:date=>"11/24/13 12:41 PM", :gross_profit=>29.5, :cogs=>8.9, :net_profit=>34.2, :units_sold=>4} 

【讨论】:

  • 这很酷,是使用eval 的一个很好的例子。 evalfearmongers:注意!
【解决方案2】:

从数组的开头删除一个括号,从末尾删除两个:

a = ["{:date=>\"11/24/13 12:39 PM\", :gross_profit=>32.5, :cogs=>9.75, \
       :net_profit=>38.5, :units_sold=>5}", \
     "{:date=>\"11/24/13 12:41 PM\", :gross_profit=>29.5, :cogs=>8.9, \
       :net_profit=>34.2, :units_sold=>4}"]

a.map {|s| s.sub("{","").sub("}","").gsub(":","").gsub(/\"/,"").split(',')}.map {|e| \
    e.map {|f|k, v = f.strip.split("=>");[k.to_sym, v]}}.map {|e| Hash[*e.flatten]}

 # => [{:date=>"11/24/13 1239 PM", :gross_profit=>"32.5", :cogs=>"9.75",
        :net_profit=>"38.5", :units_sold=>"5"},
       {:date=>"11/24/13 1241 PM", :gross_profit=>"29.5", :cogs=>"8.9",
        :net_profit=>"34.2", :units_sold=>"4"}]

让我们分解一下:

b = a.map {|s| s.sub("{","").sub("}","").gsub(":","").gsub(/\"/,"").split(',')}
  # => [["date=>"11/24/13 1239 PM", " gross_profit=>32.5", " cogs=>9.75", \
         " net_profit=>38.5", " units_sold=>5"], \
        ["date=>"11/24/13 1241 PM", " gross_profit=>29.5", " cogs=>8.9", \
         " net_profit=>34.2", " units_sold=>4"]]

    c = b.map {|e| e.map {|f|k, v = f.strip.split("=>");[k.to_sym, v]}}
      # => [[[:date, "11/24/13 1239 PM"], [:gross_profit, "32.5"], [:cogs, "9.75"], \
             [:net_profit, "38.5"], [:units_sold, "5"]], \
            [[:date, "11/24/13 1241 PM"], [:gross_profit, "29.5"], [:cogs, "8.9"], \
             [:net_profit, "34.2"], [:units_sold, "4"]]]

        c.map {|e| Hash[*e.flatten]} # => result above

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2011-01-27
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多