【问题标题】:write csv in ruby 1.9 and CSV::Writer在 ruby​​ 1.9 和 CSV::Writer 中编写 csv
【发布时间】:2010-01-26 13:06:25
【问题描述】:

我有一个代码可以在 ruby​​ 1.87 上正常工作,但不能在 ruby​​ 1.9 上工作。它说 CSV::Writer 未声明,但它仍然是 rdoc 的一部分。在 fastcsv 合并之后,csv api 是否发生了变化?

我的代码:

require 'csv'

def self.export_csv
 file_name = File.join(RAILS_ROOT, 'public','csv',"#{start_date_f}_#{end_date_f}.csv")
 return file_name if File.exist?(file_name)
 @results = find(:all)
 header_row = []
 outfile = File.open(file_name, 'wb')
 CSV::Writer.generate(outfile) do |csv|
      header_row = ['gateway_id','created', 'gateway_status_id', 'panel_id',  'panel_status','volts_out', 'amps_out', 'temp','aid' ,'sid', 'pisid']
      csv << header_row
  end
end

我收到的错误:NameError: uninitialized constant CSV::Writer

请注意,require 'csv' 在那里。我在我的控制台中尝试它,当我执行 require 'csv' 时,它可以工作,但是一旦我调用 CSV::Writer 我就会收到该错误。 这段代码在 ruby​​ 1.87 上运行良好,所以它让我认为这是一个 ruby​​ 1.9 csv 问题,因为它与 fastCSV 合并。

【问题讨论】:

    标签: ruby ruby-1.9


    【解决方案1】:

    csv 库仍然存在,但 CSV::Writer 不存在。根据 1.9.0 中的 csv.rb:

    # I'm sure I'll miss something, but I'll try to mention most of the major
    # differences I am aware of, to help others quickly get up to speed:
    #
    # === CSV Parsing
    #
    # * This parser is m17n aware.  See CSV for full details.
    # * This library has a stricter parser and will throw MalformedCSVErrors on
    #   problematic data.
    # * This library has a less liberal idea of a line ending than CSV.  What you
    #   set as the <tt>:row_sep</tt> is law.  It can auto-detect your line endings
    #   though.
    # * The old library returned empty lines as <tt>[nil]</tt>.  This library calls
    #   them <tt>[]</tt>.
    # * This library has a much faster parser.
    #
    # === Interface
    #
    # * CSV now uses Hash-style parameters to set options.
    # * CSV no longer has generate_row() or parse_row().
    # * The old CSV's Reader and Writer classes have been dropped.
    # * CSV::open() is now more like Ruby's open().
    # * CSV objects now support most standard IO methods.
    # * CSV now has a new() method used to wrap objects like String and IO for
    #   reading and writing.
    # * CSV::generate() is different from the old method.
    # * CSV no longer supports partial reads.  It works line-by-line.
    # * CSV no longer allows the instance methods to override the separators for
    #   performance reasons.  They must be set in the constructor.
    

    稍后,有一个如何逐行编写的示例(以及其他编写方法):

    # === To a File
    #
    #   CSV.open("path/to/file.csv", "wb") do |csv|
    #     csv << ["row", "of", "CSV", "data"]
    #     csv << ["another", "row"]
    #     # ...
    #   end
    

    【讨论】:

    • 是我采用的方法。我现在刚刚检查了答案,无论如何,它是一个很好的信息来源:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多