2012-02-29 2 views
2

나는 similar in Bash을 수행했으나 Ruby의 2-3 간결한 라인에서이를 수행하는 방법을 잘 모르지만 올바른 쿵 소리로 스냅 할 수는 있지만 -부. Ruby에서 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 선 다음 :

나는처럼 보이는 헤더 행에 "file.csv"가

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_이라는 접두어가 붙고 나머지는 필드 이름에서 모든 구두점, 공백, 따옴표 등을 뺀 것 (변수가 아닌 것)입니다.

가 가 가

내가 읽는 분이 걸렸다 및 CSV.read의 종류 또는 horrible slowdown using native Ruby 1.9.x CSV objects로 인해 CSV.foreach를 사용하여 종료하는 것이주의해야한다 따라서 받아 들일 수

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. 
"FCD는"나는 내 스크립트를 제공하기 위해 노력하고 그래서 위해

반복적으로 실행되는 실시간 응용 프로그램에서

$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 

을하지만 지금은 일반화 너무 털이 점점 :

대신이 같은 즉시 파일 에서 읽을 개별 변수를 할당하는 'AWK'에 루비 파이프를 사용했습니다. 첫 번째 행이 보일 때까지 알 수없는 필드가있는 CSV와 유사한 파일을 사용해야합니다.

+0

왜 변수가 필요합니까? 왜'{ "FCD"=> someObject}'의 해쉬가 아닌가? – Linuxios

+0

해시가 더 좋지는 않을지라도 빠른 것이어야합니다. [이전에] (http://stackoverflow.com/q/8476769/1069375) 루비로 CSV를 읽는 것이 실패했습니다. – Marcos

+0

변수를 사용하여 기호 테이블을 채우는 것은 해시보다 효율적일 수 없습니다. 또한 무엇이든 전역 변수를 사용하는 것은 좋은 생각이 아닙니다. – Linuxios

답변

0

생각하고 있습니다. 루비는 두 줄의 CSV 입력을 볼 수 있도록하는 중도 방법은, 그래서 기본 처리가 빨라야한다 :

puts IO.readlines(%`|sed -n "1p; /^#{$stock},/p" AllStocks.csv`) # sed filters out the gazillion other lines that make Ruby slow 

의미가 있습니다. 루비는 짧은 CSV를 볼 수 있기 때문에, 헤더 한 줄과 sed 데이터 덕분에 한 줄, 그것은 순식간에로드하고 내 해시이 있습니다 (I 후했다 연관 배열)

$stock = "ANAD" 

csv_data = CSV.parse IO.read(%`|sed -n "1p; /^#{$stock},/p" AllStocks.csv`) 
headers = csv_data.shift.map {|i| i.to_s } 
string_data = csv_data.map {|row| row.map {|cell| cell.to_s } } 
tickers = array_of_hashes = string_data.map {|row| Hash[*headers.zip(row).flatten] } 

pp tickers[0]  
=> {"Ticker"=>"ANAD", "Price"=>"2.57", "Market Cap"=>"175.20", "Average Volume"=>"442.65", "Analyst Recom"=>"2.90", "Relative Strength Index (14)"=>"38.21", "Sector"=>"Technology", "Industry"=>"Semiconductor - Integrated Circuits", "Dividend Yield"=>"", "Beta"=>"2.30", "52-Week Low"=>"33.85%", "52-Week High"=>"-52.84%", "50-Day Low"=>"27.23%", "50-Day High"=>"-20.19%", "Company"=>"Anadigics, Inc.", "50-Day Simple Moving Average"=>"-2.63%", "Country"=>"USA", "P/E"=>"", "Forward P/E"=>"", "PEG"=>"", "P/S"=>"1.15", "P/B"=>"1.05", "P/Cash"=>"3.08", "P/Free Cash Flow"=>"", "Payout Ratio"=>"", "EPS (ttm)"=>"-0.73", "EPS growth this year"=>"-4002.36%", "EPS growth next year"=>"57.90%", "EPS growth past 5 years"=>"-7.14%", "EPS growth next 5 years"=>"15.67%", "Sales growth past 5 years"=>"-1.69%", "EPS growth quarter over quarter"=>"-564.96%", "Sales growth quarter over quarter"=>"-39.37%", "Shares Outstanding"=>"68.17", "Shares Float"=>"66.25", "Insider Ownership"=>"3.87%", "Insider Transactions"=>"-7.51%", "Institutional Ownership"=>"47.64%", "Institutional Transactions"=>"-6.24%", "Float Short"=>"3.30%", "Short Ratio"=>"4.95", "Return on Assets"=>"-23.34%", "Return on Equity"=>"-26.70%", "Return on Investment"=>"-26.33%", "Current Ratio"=>"4.89", "Quick Ratio"=>"3.90", "LT Debt/Equity"=>"0.00", "Total Debt/Equity"=>"0.00", "Gross Margin"=>"20.35%", "Operating Margin"=>"-32.79%", "Profit Margin"=>"-32.27%", "Performance (Week)"=>"-5.17%", "Performance (Month)"=>"-7.22%", "Performance (Quarter)"=>"21.23%", "Performance (Half Year)"=>"-6.20%", "Performance (Year)"=>"17.35%", "Average True Range"=>"0.16", "Volatility (Week)"=>"5.14%", "Volatility (Month)"=>"5.51%", "20-Day Simple Moving Average"=>"-13.04%", "200-Day Simple Moving Average"=>"-3.71%", "Change from Open"=>"-4.10%", "Gap"=>"0.00%", "Relative Volume"=>"0.95", "Change"=>"-4.10%", "Volume"=>"421200", "Earnings Date"=>"2/22/2012 7:00:00 AM", "No."=>"280"} 


tickers[0]["Volatility (Month)"].to_f 
=> 5.51 
1

이를 단일 라인 버전은 last보다 우수합니다. 그것은 짧다, 간단하게, 특히 매력적인 것은, 나중에 그 물건의 대부분을 구문 분석에 대해 걱정할 (almost-) 가변 준비 독특한 이름은 내가하지 않아도에 모든 헤더 타이틀을 적응 :

csv_data = CSV.parse IO.read(%`|sed -n "1p; /^#{$stock},/p" AllStocks.csv`), {:headers => true, :return_headers => false, :header_converters => :symbol, :converters => :all} 

결과 :

csv_data.size 
=> 1 

csv_data.to_a 
=> [[:ticker, :price, :market_cap, :average_volume, :analyst_recom, :relative_strength_index_14, :sector, :industry, :dividend_yield, :beta, :"52week_low", :"52week_high", :"50day_low", :"50day_high", :company, :"50day_simple_moving_average", :country, :pe, :forward_pe, :peg, :ps, :pb, :pcash, :pfree_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_debtequity, :total_debtequity, :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, :"20day_simple_moving_average", :"200day_simple_moving_average", :change_from_open, :gap, :relative_volume, :change, :volume, :earnings_date, :no], ["ANAD", 2.57, 175.2, 442.65, 2.9, 38.21, "Technology", "Semiconductor - Integrated Circuits", nil, 2.3, "33.85%", "-52.84%", "27.23%", "-20.19%", "Anadigics, Inc.", "-2.63%", "USA", nil, nil, nil, 1.15, 1.05, 3.08, nil, nil, -0.73, "-4002.36%", "57.90%", "-7.14%", "15.67%", "-1.69%", "-564.96%", "-39.37%", 68.17, 66.25, "3.87%", "-7.51%", "47.64%", "-6.24%", "3.30%", 4.95, "-23.34%", "-26.70%", "-26.33%", 4.89, 3.9, 0.0, 0.0, "20.35%", "-32.79%", "-32.27%", "-5.17%", "-7.22%", "21.23%", "-6.20%", "-50.39%", "17.35%", 0.16, "5.14%", "5.51%", "-13.04%", "-3.71%", "-4.10%", "0.00%", 0.95, "-4.10%", 421200, "2/22/2012 7:00:00 AM", 280]] 


$company = csv_data[:company][0] 
=> "Anadigics, Inc." 

csv_data[:volatility_month] 
=> ["5.51%"] 
관련 문제