2013-10-08 74 views
-1

我正在写一个程序,允许用户输入日期并输入他们在特定日期所需的股票信息的类型。所有的股票信息和日期都在一个单独的CSV文件中。我的程序不会运行,我觉得我好像缺少了一些东西。这是一个类,我不想使用Ruby的CSV类。我如何查看GE股票信息?

下面是这个文件看起来什么样,如:

date,open,high,low,close,volume,changed,changep,adjclose,tradeval,tradevol 
2013-10-07,23.84,23.90,23.80,23.89,3522559,-0.16,-0.67%,23.89,83992937.36,8462 
2013-10-04,24.18,24.18,23.90,24.05,33274615,-0.05,-0.21%,24.05,800232596.05,74361 
2013-10-03,24.22,24.25,23.84,24.10,37466161,-0.23,-0.95%,24.10,902130194.02,95122 

这是我的计划:

#open the file 
data = File.open("data.csv","r+") 

#make an empty hash 
stocks = {} 

contents = data.readlines 
data.close 

#this add quotes between each line 
contents.collect! do |x| 
    x.chomp 
end 
#this splits up each in into its own array 

contents.collect! do |x| 
    x.split(',') 
end 



contents.each do |x| 
    stocks[x[0]] = x 
end 



puts "This program has all the General Electic stock information from November 27, 1960 to October 8 2013. Please enter the date you would like to find the stock information of like this: 1997-10-30 (year-month-day)." 
#prompt user for the date of the stock info they would like to find 
date = gets.chomp 

data = stocks[date] 


puts "Please enter what information about the stock you would like to know: open, high, low, close, volume, changed, percent change,adjusted closing, trade value, or trade volume. Please put a underscore in place of all spaces." 
#get an input for what type of stock information the user would like 
input = gets.chomp 
#elsif statement to give the user the info they need based on what stock info they want 


if input == open 
    puts "The open of your stock is: #{data[1]}" 
    elsif input == high 
      puts "The high of your stock is: #{data[2]}" 
    elsif input == low 
      puts "The low of your stock is: #{data[3]}" 
    elsif input == close 
      puts "The close of your stock is: #{data[4]}" 
    elsif input == volume 
      puts "The volume of your stock is: #{data[5]}" 
    elsif input == changed 
      puts "The volume of your stock is: #{data[6]}" 
    elsif input == percent_change 
      puts "The percent change of your stock is: #{data[7]}" 
    elsif input == adjusted_closing 
      puts "The open adjusted closing of your stock is: #{data[8]}" 
    elsif input == trade_value 
      puts "The trade value of your stock is: #{data[9]}" 
    else input == trade_volume 
      puts "The trade volume of your stock is: #{data[10]}" 

    end 
+0

这是对您的问题代码进行的彻底编辑,使答案看起来不相关。 –

回答

0

这里是你的代码清理了一下:

require 'csv' 

puts "This program has all the General Electric stock information from November 
27, 1960 to October 8 2013. Please enter the date you would like to find the 
stock information of like this: 1997-10-30 (year-month-day)." 
date = gets.chomp 

puts "Please enter what information about the stock you would like to know: 
open, high, low, close, volume, changed, percent change,adjusted closing, trade 
value, or trade volume. Please put a underscore in place of all spaces." 
input = gets.chomp 

CSV.foreach(
    'test.csv', 
    :headers => true, 
    :return_headers => false 
) do |row| 

    next unless row['date'] == date 

    if input == 'open' 
    puts "The open of your stock is: #{ row['open'] }" 
    elsif input == 'high' 
    puts "The high of your stock is: #{ row['high'] }" 
    elsif input == 'low' 
    puts "The low of your stock is: #{ row['low'] }" 
    elsif input == 'close' 
    puts "The close of your stock is: #{ row['close'] }" 
    elsif input == 'volume' 
    puts "The volume of your stock is: #{ row['volume'] }" 
    elsif input == 'changed' 
    puts "The volume of your stock is: #{ row['changed'] }" 
    elsif input == 'percent_change' 
    puts "The percent change of your stock is: #{ row['percent_change'] }" 
    elsif input == 'adjusted_closing' 
    puts "The open adjusted closing of your stock is: #{ row['adjusted_closing'] }" 
    elsif input == 'trade_value' 
    puts "The trade value of your stock is: #{ row['trade_value'] }" 
    elseif input == 'trade_volume' 
    puts "The trade volume of your stock is: #{ row['trade_volume'] }" 
    else 
    puts "An unknown option was entered." 
    end 

end 

随着这些输入:

1997-10-30 
open 

返回:

The open of your stock is: 23.84 
The open of your stock is: 24.18 
The open of your stock is: 24.22 

使用Ruby的CSV类。它已经写好了,并且已经过调试和测试,所以你不必重新发明这个轮子。您可以告诉它使用CSV文件的第一行作为标题,以及是否应该返回这些文件。此外,它可以将一行数据作为数组或散列返回。把它作为哈希函数返回对你想要做的事情非常有用。


这里有一些重构向您展示如何简化和删除冗余代码:

require 'csv' 

puts "This program has all the General Electric stock information from November 
27, 1960 to October 8 2013. Please enter the date you would like to find the 
stock information of like this: 1997-10-30 (year-month-day)." 
date = gets.chomp 

puts "Please enter what information about the stock you would like to know: 
open, high, low, close, volume, changed, percent change,adjusted closing, trade 
value, or trade volume. Please put a underscore in place of all spaces." 
input = gets.chomp 

CSV.foreach(
    'test.csv', 
    :headers => true, 
    :return_headers => false 
) do |row| 

    next unless row['date'] == date 

    case input 
    when 'open' 
    puts "The open of your stock is: #{ row['open'] }" 
    when 'high' 
    puts "The high of your stock is: #{ row['high'] }" 
    when 'low' 
    puts "The low of your stock is: #{ row['low'] }" 
    when 'close' 
    puts "The close of your stock is: #{ row['close'] }" 
    when 'volume' 
    puts "The volume of your stock is: #{ row['volume'] }" 
    when 'changed' 
    puts "The volume of your stock is: #{ row['changed'] }" 
    when 'percent_change' 
    puts "The percent change of your stock is: #{ row['percent_change'] }" 
    when 'adjusted_closing' 
    puts "The open adjusted closing of your stock is: #{ row['adjusted_closing'] }" 
    when 'trade_value' 
    puts "The trade value of your stock is: #{ row['trade_value'] }" 
    when 'trade_volume' 
    puts "The trade volume of your stock is: #{ row['trade_volume'] }" 
    else 
    puts "An unknown option was entered." 
    end 

end 

这个版本替换if/elseif/elsecase/when这有助于简化逻辑,并返回相同的事情了相同的输入。


require 'csv' 

puts "This program has all the General Electric stock information from November 
27, 1960 to October 8 2013. Please enter the date you would like to find the 
stock information of like this: 1997-10-30 (year-month-day)." 
date = gets.chomp 

puts "Please enter what information about the stock you would like to know: 
open, high, low, close, volume, changed, percent change,adjusted closing, trade 
value, or trade volume. Please put a underscore in place of all spaces." 
input = gets.chomp 

CSV.foreach(
    'test.csv', 
    :headers => true, 
    :return_headers => false 
) do |row| 

    next unless row['date'] == date 

    val = case input 
     when 'open' 
      'open' 
     when 'high' 
      'high' 
     when 'low' 
      'low' 
     when 'close' 
      'close' 
     when 'volume' 
      'volume' 
     when 'changed' 
      'changed' 
     when 'percent_change' 
      'percent_change' 
     when 'adjusted_closing' 
      'adjusted_closing' 
     when 'trade_value' 
      'trade_value' 
     when 'trade_volume' 
      'trade_volume' 
     else 
      puts "An unknown option was entered." 
      next 
     end 

    puts "The %s of your stock is: %s" % [val.gsub('_', ' '), row[val] ] 

end 

这建立在case声明,只返回什么样的变化,同时也向我们展示了大量的冗余。


require 'csv' 

puts "This program has all the General Electric stock information from November 
27, 1960 to October 8 2013. Please enter the date you would like to find the 
stock information of like this: 1997-10-30 (year-month-day)." 
date = gets.chomp 

puts "Please enter what information about the stock you would like to know: 
open, high, low, close, volume, changed, percent change, adjusted closing, 
trade value, or trade volume. Please put a underscore in place of all spaces." 
input = gets.chomp 

CSV.foreach(
    'test.csv', 
    :headers => true, 
    :return_headers => false 
) do |row| 
    puts "The %s of your stock is: %s" % [input.gsub('_', ' '), row[input] ] if (row['date'] == date) 
end 

剔除在此代码冗余结果。

+0

您可以告诉我如何在不使用Ruby的csv类的情况下执行此操作吗? – user2759592

+1

虽然可以重写CSV模块,但我不会去尝试;过去我曾经去过那么多次。 CSV是一种严重滥用的数据格式,对于简单的任务,编写简单的解析器并不难。我可以告诉你如何,但我会收取你的费用;你可以使用'IO.foreach'和'String.split'来找出一个简单的问题,只要你不处理嵌入的逗号,你应该没问题。但是,*为什么*你不想使用内置工具来做到这一点?忽略内置功能是一个不好的决定。 –

+0

我更新了我的问题 – user2759592