Ruby CSV文件创建仅输出一个长行

时间:2016-02-11 05:39:45

标签: ruby-on-rails ruby csv dropbox-api

在Ruby中创建CSV文件时遇到问题。这是我的代码:

filename = "filename-#{Time.now}.csv"
#temp_csv = Tempfile.new(filename)
csv_header = ["example", "example", "example", "example", "example"]
new_csv = CSV.open(filename, 'w') do |csv_object|
  csv_object << csv_header
  normalized_data.each do |data|
    csv_object << data
  end
end

现在,我的问题是filename保存到磁盘看起来非常好,有多行。当我使用binding.pry检查data时,它看起来应该是它应该的,一个包含元素的数组。但是,如果我保存new_csv打开它,所有内容都会卡在一个非常长的行中,以[[开头,意味着一切似乎都被包裹在一个数组中...... 为什么是这样?我很难过,我花了几个小时试图解决问题。

聚苯乙烯。 #tmp_csv已被注释掉,因为该策略也不起作用,但最终我想创建的是一个临时文件。

非常感谢任何帮助。

更多信息修改:

正如我所说,filename实际上是在我的系统中很好地创建的,但是我尝试使用Dropbox API中的put_file方法将此文件上传到Dropbox,当我在Dropbox中打开它时,所有内容都在一个线。

我上传的方式是:

client.put_file("#{DROPBOX_PATH}/example_file_#{Time.now}.csv", file_name) 当我在Dropbox中打开它时,一切都变成了一行。

这就是我normalized_data的样子,我相信这很好:

[["text",
  "text",
  "text",
  "2016-02-09",
  3,
  "text",
  {},
  false,
  "text",
  {"text"=>{}, "text"=>1},
  ["text", "text", "text"],
  "text",
  {"text"=>"text", "text2"=>{}}],
...
...

2 个答案:

答案 0 :(得分:1)

按原样保存new_csv没有任何意义,因为它是CSV.open(filename, 'w')的结果。是的,它是一个数组数组,它​​是如何在ruby中表示CSV(行数组,每一行都是列数组。)

目前还不清楚,为什么要尝试直接保存new_csv。 Basicaly,此操作将上面提到的数组数组转换为字符串,并将此字符串存储在文件中。

正如您所指出的,CSV本身已正确写入(filename)。无论您是想在代码中继续使用CSV,都可以选择阵列数组。

希望它有所帮助。

答案 1 :(得分:0)

我的猜测是normalized_data[[['a', 'b'],['c', 'd']]]之类的三重数组或['a', 'b', 'c']之类的平面数组。

应该是一个像[['a', 'b', 'c'],['d', 'e', 'f']]这样的数组数组。 或平面阵列

您的normalized_data应该像[[&#39; a&#39;,&#39; b&#39;,&#39; c&#39;]

使用此代码:

require 'csv'

normalized_data = [['a', 'b', 'c'], ['d', 'e', 'f']]
new_data = CSV.open('file.csv', 'w') do |csv|
  normalized_data.each do |data|
    csv << data
  end
end

puts "New data:"
puts new_data.inspect
puts "File contents:"
puts File.read('file.csv')

输出符合预期:

New data:
[["a", "b", "c"], ["d", "e", "f"]]
File contents:
a,b,c
d,e,f