【问题标题】:Ruby - reading CSV from STDINRuby - 从 STDIN 读取 CSV
【发布时间】: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"

标签: ruby csv


【解决方案1】:

此代码正在运行:

require 'csv'

class Call
  def initialize(args)
  end
end

def 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 { |row| Call.new(row) }
end

filename = ARGV[0]
load_csv(filename)

【讨论】:

  • 我从您的答案中复制了整个课程并使其完全相同 - 但运行它之后,它仍然什么都不做。我可以离开电脑几个小时,仍然一无所获。会不会是其他原因导致它不起作用?
  • 您是否输入了 CSV 文件的名称? gets 方法无限期地等待,直到您输入任何字符串,然后回车。
  • 我想我没有用正确的话 - 我希望能够运行:ruby program.rb filename.csv
  • 我编辑了代码,所以它会按照你想要的方式工作。您必须使用 ARGV 从命令行而不是 STDIN.gets 传递值。
  • 我会使用 ARGF,像这样你可以从文件或标准输入中读取而无需任何更改。
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多