我如何查询GE股票信息?

时间:2013-10-08 20:09:17

标签: ruby arrays if-statement

我正在编写一个程序,允许用户输入日期并输入他们在特定日期所需的股票信息类型。所有股票信息和日期都在一个单独的CSV文件中。我的程序不会运行,我觉得我错过了一些东西。这是一个类,我不想使用ruby的CSV类。

以下是此文件的示例:

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

1 个答案:

答案 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/else替换为case/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

在此代码中删除冗余结果。