我正在尝试从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
答案 0 :(得分:1)
通常每个if
应该有一个相应的end
,而你的=
则没有。此外,您还要非常小心地混淆==
赋值运算符和if row[2] == 'music'
# ...
end
比较运算符。正确的代码是:
if
唯一的例外是尾随total_sales += row[6] if row[2] == 'music'
子句:
x += y
我建议初学者一开始就要避开那些,因为如果被滥用会导致令人费解的代码混乱。请注意x = x + y
是case row[2]
when 'music'
total_sales += row[6]
end
的简写,并且经常更清楚地传达正在发生的事情。
要考虑的另一件事是以这种方式编写代码:
row
这样就不可能做出意外分配。
要考虑的另一件事是将CSV.foreach(...) do |a, b, type, c, d, sales|
分解为实际的列名,如下所示:
a
更改b
和row[2]
以表示该列中存在的任何值。这比{{1}}更具可读性。
答案 1 :(得分:1)
Ruby不是python:unindenting代码不足以关闭块或语句:
if row[2] == 'music'
total_sales = total_sales + row[6]
end # <------------ this was missing!!!