【发布时间】:2012-03-19 03:17:51
【问题描述】:
我已经完成了 similar in Bash 的操作,但不确定如何在 2-3 行简洁的 Ruby 中做到这一点,尽管它似乎可以通过正确的编码功夫很快完成。
我有一个“file.csv”,其标题行如下所示:
Ticker,"Price","Market Cap","Average Volume","Analyst Recom","Relative Strength Index (14)","Sector","Industry","Dividend Yield","Beta","52-Week Low","52-Week High","50-Day Low","50-Day High","Company","50-Day Simple Moving Average","Country","P/E","Forward P/E","PEG","P/S","P/B","P/Cash","P/Free Cash Flow","Payout Ratio","EPS (ttm)","EPS growth this year","EPS growth next year","EPS growth past 5 years","EPS growth next 5 years","Sales growth past 5 years","EPS growth quarter over quarter","Sales growth quarter over quarter","Shares Outstanding","Shares Float","Insider Ownership","Insider Transactions","Institutional Ownership","Institutional Transactions","Float Short","Short Ratio","Return on Assets","Return on Equity","Return on Investment","Current Ratio","Quick Ratio","LT Debt/Equity","Total Debt/Equity","Gross Margin","Operating Margin","Profit Margin","Performance (Week)","Performance (Month)","Performance (Quarter)","Performance (Half Year)","Performance (Year)","Performance (Year)","Average True Range","Volatility (Week)","Volatility (Month)","20-Day Simple Moving Average","200-Day Simple Moving Average","Change from Open","Gap","Relative Volume","Change","Volume","Earnings Date","No."
接下来是大约 7000 行,如下所示:
FCD,27.89,,0.94,,66.75,"Financial","Exchange Traded Fund",3.13%,,19.75%,-0.36%,6.37%,-0.36%,"Focus Morningstar Consumer Defensive ETF",2.28%,"USA",,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,0.36%,3.07%,9.93%,10.85%,,2.01%,0.12,0.04%,0.21%,1.26%,6.69%,0.00%,-0.04%,0.96,-0.04%,900,,2186
FCE-A,14.59,2496.64,960.33,2.50,54.76,"Financial","Property Management",,2.83,56.55%,-24.87%,36.61%,-7.77%,"Forest City Enterprises Inc.",11.49%,"USA",,69.48,,2.2
5,1.58,10.87,,,-0.02,410.77%,250.00%,-10.06%,8.00%,1.54%,-28.77%,-9.00%,171.12,136.94,0.26%,-8.25%,74.80%,-0.13%,4.62%,6.59,0.46%,-0.12%,0.54%,,,4.35,4.35,39.54%,
4.82%,4.60%,-4.01%,8.96%,25.45%,13.10%,-22.80%,23.43%,0.44,3.07%,2.98%,-0.89%,1.49%,-1.62%,0.00%,0.47,-1.62%,449874,12/8/2010 4:30:00 PM,2187
给定一个股票代码“FCD”,我正在尝试将来自标题字段的大约 30 个新变量批量分配给与“FCD”行匹配的值。
每个新变量都应以fv_ 为前缀,其余部分与字段名称一样减去所有标点符号、空格、引号等(对变量不友好的内容)。
所以对于“FCD”,我想给出我的脚本:
fv_Ticker="FCD"
fv_Price=27.89
fv_MarketCap=""
fv_VolatilityMonth=0.21 # if get String not Float because of trailing % in "0.21%" that's okay, will deal with it later
etc.
我应该注意,由于horrible slowdown using native Ruby 1.9.x CSV objects,我退出了使用任何类型的CSV.read 或CSV.foreach,这需要几分钟才能阅读,因此在重复运行的实时应用程序中是不可接受的。
相反,我一直在使用 Ruby 管道来“awk”分配从文件中读取的单个变量立即,如下所示:
$stock="FCD"
$dividend_yield = IO.readlines("|awk -F, '$1==\"#{$stock}\" {print $9}' finviz.AllStocks.csv")[0].to_f
$beta = IO.readlines("|awk -F, '$1==\"#{$stock}\" {print $10}' AllStocks.csv")[0].to_f
但现在它变得太复杂了,不能一概而论。它需要处理任何具有未知字段的类 CSV 文件,直到它看到的第一行。
【问题讨论】:
-
为什么是变量?为什么不是
{"FCD"=>someObject}的哈希? -
哈希也可以,如果不是更好的话,但它需要很快。 Previously 将 CSV 读入 Ruby 失败了。
-
用变量填充符号表的效率不能低于哈希。此外,对任何东西使用全局变量,尤其是这个,不是一个好主意。
-
我在 bash 解决方案中看到您使用的是 Google 财务。 Google Finance 能否以比 CSV 或 XML 更有效的格式提供输出?可能是二进制格式?亚美尔? JSON?所有这些都更加高效。