【发布时间】:2016-10-03 09:29:14
【问题描述】:
我正在尝试从 .CSV 文件中读取并创建具有每一行属性的对象。 我的代码运行良好:
def self.load_csv
puts "Name of a file?"
filename = STDIN.gets.chomp
rows = []
text = File.read(filename).gsub(/\\"/,'""')
CSV.parse(text, headers: true, header_converters: :symbol) do |row|
row = row.to_h
row = row.each_with_object({}){|(k,v), h| h[k.to_sym] = v}
rows << row
end
rows.map do |row|
Call.new(row)
end
end
end
现在我想从 STDIN 获取文件名。我只是改变了:
def self.load_csv(filename)
rows = []
text = File.read(filename).gsub(/\\"/,'""')
CSV.parse(text, headers: true, header_converters: :symbol) do |row|
row = row.to_h
row = row.each_with_object({}){|(k,v), h| h[k.to_sym] = v}
rows << row
end
rows.map do |row|
Call.new(row)
end
end
end
当我尝试使用 ruby program.rb filename.csv 时出现错误,没有将 String 隐式转换为 IO,在删除带有 File.read 的行后,它什么也没做 - 可能像无限循环?当然,我在代码的不同部分使用 STDIN 参数调用某些方法。过去我使用类似的代码从 STDIN 读取成功,这次我做错了什么?
【问题讨论】:
-
您是否从 STDIN 获取文件名,然后将其作为参数传递给
load_csv方法? -
是的,完全正确。我调用 load_csv(STDIN)
-
我按你说的改了,但知道它什么也没做——就像一个无限循环
-
顺便说一下,您可以使用:
ARGF.read,它将与管道连接到 STDIN 并传入文件名作为参数。 robots.thoughtbot.com/rubys-argf -
不管我用什么还是会抛出错误 File.read(filename) - "no implicit conversion of String to IO"