【问题标题】:Parsing data to a csv file on a new line - ruby将数据解析为新行上的 csv 文件 - ruby
【发布时间】:2013-12-11 01:56:53
【问题描述】:

我正在尝试将我“获取”的数据导出到一个新的 csv 文件中。目前,我下面的代码将每个人都发布到一行,直到填满,然后继续到下一行。 我希望它在导入数据时从下面的行开始,创建一个事务列表。

def export_data
    File.open('coffee_orders.csv', 'a+') do |csv|
      puts @item_quantity = [Time.now, @item_name, @amount]
      csv << @item_quantity
    end
end

【问题讨论】:

  • 不要尝试创建自己的 CSV 生成器。相反,使用 Ruby 的内置 CSV 类。 CSV 是一种被严重滥用的格式,在您尝试重新加载数据并被咬之前,它可能会有一些您无法识别的陷阱。您当前的使用很简单,但并不总是这样,养成做正确事情的习惯会有所帮助。

标签: ruby parsing csv export-to-csv


【解决方案1】:

根据您的起始代码,我会执行以下操作:

def export_data
  File.open('coffee_orders.csv', 'a') do |csv|
    csv << [Time.now, @item_name, @amount].join(', ')
  end
end

或者:

def export_data
  File.open('coffee_orders.csv', 'a') do |csv|
    csv << '%s, %s, %s' % [Time.now, @item_name, @amount].map(&:to_s)
  end
end

注意,没有必要使用'a+' 附加到文件。而是仅使用'a',除非您在文件打开时绝对需要“读取”模式。以下是IO.new 文档的内容:

"a" 只写,如果文件存在,则从文件末尾开始, 否则创建一个新文件进行写入。 "a+" 读写,如果文件存在,则从文件末尾开始, 否则创建一个新文件以供读取和 写作。

我自己写它的方式是这样的:

CSV_FILENAME = 'coffee_orders.csv'
def export_data
  csv_has_content = File.size?(CSV_FILENAME)
  CSV.open(CSV_FILENAME, 'a') do |csv|
    csv << %w[Time Item Amount] unless csv_has_content
    csv << [Time.now, @item_name, @amount]
  end
end

这使用 Ruby 的 CSV 类来处理所有的细节。它检查文件是否已经存在,如果它没有内容,它会在写入内容之前写入标题。

【讨论】:

    【解决方案2】:

    试试这个。它将在每次交易后添加一个新行。当您接下来附加到它时,它将来自一个新行。

    def export_data
      File.open('coffee_orders.csv', 'a+') do |csv|
        csv.puts @item_quantity = [Time.now, @item_name, @amount]
      end
    end
    

    虽然通过查看扩展名,您可能希望将其限制为 csv 格式。

    def export_data
      File.open('coffee_orders.csv', 'a+') do |csv|
        @item_quantity = [Time.now, @item_name, @amount]
        csv.puts @item_quantity.join(',')
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多