也许有人能帮我。
从如下CSV文件开始:
Ticker,"Price","Market Cap"
ZUMZ,30.00,933.90
XTEX,16.02,811.57
AAC,9.83,80.02
我设法将它们读入一个数组:
require 'csv'
tickers = CSV.read("stocks.csv", {:headers => true, :return_headers => true, :header_converters => :symbol, :converters => :all} )
要验证数据,请执行以下操作:
puts tickers[1][:ticker]
ZUMZ
然而,这并不能:
puts tickers[:ticker => "XTEX"][:price]
如何将这个数组转换为一个哈希值,使用ticker字段作为唯一键,这样我就可以轻松地查找输入的第1行中定义的任何其他关联字段了?
非常感谢!
7条答案
按热度按时间dfuffjeb1#
如下所示(它也适用于其他CSV,而不仅仅是您指定的CSV):
结果:
您可以访问此数据结构中的元素,如下所示:
编辑(根据注解):要选择元素,您可以执行以下操作
k2arahey2#
eblbsuwk3#
为了补充Michael Kohl的答案,如果你想以下面的方式访问元素
您可以尝试以下代码片段:
hec6srdp4#
为了获得两个世界的最佳效果(非常快速地阅读一个巨大的文件和一个本地Ruby CSV对象的好处),我的代码后来演变成了这样一种方法:
这更接近我最初的方法,但是只读取一条记录和包含头的输入csv文件的第一行。内联
sed
指令负责这一点--整个过程非常即时。这比last好,因为现在我可以访问Ruby中的所有字段,而不再像awk
那样关心列号。31moq8wy5#
不像1-liner-ie,但这对我来说更清楚。
enxuqcxy6#
vjhs03f77#
虽然这不是原始问题的100%原生Ruby解决方案,但如果其他人在这里遇到困难,想知道我现在使用的awk调用是什么,那么它就是:
其中$stock是我先前分配给公司股票代码(想要成为关键字段)的变量。如果满足以下条件,则返回0.0,从而方便地解决问题:股票代码或文件或字段#9没有找到或为空,或者值不能转换为浮点型。因此,在我的情况下,任何尾随的“%”都会被很好地截断。
请注意,此时可以在awk中轻松添加更多过滤器以获得IO。readlines从较小的CSV结果中返回一个一维输出行数组,例如。
在bash中输出哪些行的DivYld(第9列)大于2.01,price(第2列)大于99.99。(不幸的是,我没有使用标题行来确定字段编号,而这正是我最终希望的一些可搜索的关联Ruby数组。)