如何计算音乐的总销售额

时间:2017-01-24 23:12:26

标签: ruby csv

我正在尝试从CSV文件中检索信息:

require 'csv'

total_sales = 0

CSV.foreach('sales-data.csv', headers: true, converters: :all) do |row|
  # TODO: check if category is "Music" (row[2])
  # TODO: if it is music, add total_sales + the row's sales (row[6])
  if row[2] = 'music'
    total_sales = total_sales + row[6]
end

puts total_sales.round(2)

当我运行此代码时,收到此错误:

our-sales-report.rb:12: syntax error, unexpected end-of-input, 
expecting keyword_end

2 个答案:

答案 0 :(得分:1)

通常每个if应该有一个相应的end,而你的=则没有。此外,您还要非常小心地混淆==赋值运算符和if row[2] == 'music' # ... end 比较运算符。正确的代码是:

if

唯一的例外是尾随total_sales += row[6] if row[2] == 'music' 子句:

x += y

我建议初学者一开始就要避开那些,因为如果被滥用会导致令人费解的代码混乱。请注意x = x + ycase row[2] when 'music' total_sales += row[6] end 的简写,并且经常更清楚地传达正在发生的事情。

要考虑的另一件事是以这种方式编写代码:

row

这样就不可能做出意外分配。

要考虑的另一件事是将CSV.foreach(...) do |a, b, type, c, d, sales| 分解为实际的列名,如下所示:

a

更改brow[2]以表示该列中存在的任何值。这比{{1}}更具可读性。

答案 1 :(得分:1)

Ruby不是python:unindenting代码不足以关闭块或语句:

if row[2] == 'music'
  total_sales = total_sales + row[6]
end # <------------ this was missing!!!