【问题标题】:access array within array and map values在数组和映射值中访问数组
【发布时间】:2014-12-28 20:47:57
【问题描述】:

我正在从一个 CSV 文件中读取一个数组,该数组变为

parse = [["742", "Rewards", "0.309", "0.249", "0.0195", "0.1"], ["742", "Reg (DB)", "0.165", "0.194", "0.0005", "0.21"]]

我正在尝试访问数组中的数组并将解析中的文本格式更改为整数和浮点数。我当前的代码如下所示:

require 'CSV'

parse = CSV.read("testDB.csv")
parse.map do |code, cat, pervol, percnt, rate, fee| 
  code.to_i
  pervol.to_f
  percnt.to_i
  rate.to_f
  fee.to_f
end

我是 ruby​​ 新手,知道这是不正确的,但我无法找到正确的组合来相应地更改数组。谁能帮忙解决一下?

【问题讨论】:

    标签: ruby arrays map


    【解决方案1】:

    你想这样做吗?:

    parse.map{ |r| [r[0].to_i, r[1], r[2].to_f, r[3].to_f, r[4].to_f, r[5].to_f] }
    #=> [[742, "Rewards", 0.309, 0.249, 0.0195, 0.1], [742, "Reg (DB)", 0.165, 0.194, 0.0005, 0.21]]
    

    parse 是一个数组数组,因此,在map 中,您必须使用其索引访问数组对象,然后进行相应的操作。

    正如 Jörg W Mittag 指出的那样,您可以通过解构绑定和有意义的变量名称(这有助于理解哪个对象是数组中的内容)来做到这一点:

    parse.map{ |code, cat, pervol, percnt, rate, fee| [code.to_i, cat, pervol.to_f, percnt.to_f, rate.to_f, fee.to_f] }
    

    【讨论】:

    • 啊,谢谢,我以前尝试这种方式时错过了数组括号,我现在明白了。谢谢!
    • 如果您使用解构绑定和有意义的变量名而不是无意义的索引,这将更容易阅读:parse.map{ |code, cat, pervol, percnt, rate, fee| [code.to_i, cat, pervol.to_f, percnt.to_f, rate.to_f, fee.to_f] }
    • @JörgWMittag :这真的很有帮助。感谢您的洞察力。
    【解决方案2】:

    我建议如下:

    parse = [["742", "Rewards",  "0.309", "0.249", "0.0195", "0.1"],
             ["742", "Reg (23)", "0.165", "0.194", "0.0005", "0.21"]]
    
    parse.map do |arr|
      arr.map do |e|
        case e
        when /^\d+$/ then e.to_i
        when /^\d+\.\d+$/ then e.to_f
        else e
        end
      end
    end
      #=> [[742, "Rewards", 0.309, 0.249, 0.0195, 0.1],
      #    [742, "Reg (23)", 0.165, 0.194, 0.0005, 0.21]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2017-10-07
      • 2021-10-24
      • 1970-01-01
      • 2021-05-17
      • 2020-01-31
      相关资源
      最近更新 更多