Ruby CSV 文件创建仅输出一长行
Ruby CSV File creation outputting only one long row
我在 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
并打开它,所有内容都被塞进一个很长的行,以 [[
开头,这意味着所有内容似乎都包含在一个数组中......
为什么是这样?我很困惑,我花了几个小时试图解决这个问题。
Ps。
#tmp_csv
被注释掉了,因为该策略也不起作用,但最终我想创建的是一个临时文件。
如有任何帮助,我们将不胜感激。
更多信息编辑:
正如我所说,filename
实际上在我的系统中创建得很好,但是我随后尝试使用 Dropbox API 中的 put_file 方法将此文件上传到 Dropbox,并且当我在 Dropbox 中打开它,所有内容都在一行中。
我上传的方式是:
client.put_file("#{DROPBOX_PATH}/example_file_#{Time.now}.csv", file_name)
当我在保管箱中打开它时,所有内容都在一行中。
这是我的 normalized_data
的样子,我相信这很好:
[["text",
"text",
"text",
"2016-02-09",
3,
"text",
{},
false,
"text",
{"text"=>{}, "text"=>1},
["text", "text", "text"],
"text",
{"text"=>"text", "text2"=>{}}],
...
...
按原样保存 new_csv
没有任何意义,因为它是 CSV.open(filename, 'w')
的结果。是的,它是一个数组数组,它是 CSV 在 ruby 中的表示方式(一个行数组,每一行都是一个列数组。)
不清楚,为什么要尝试直接保存new_csv
。基本上,此操作将上述数组数组转换为字符串并将此字符串存储在文件中。
正如您所指出的,CSV 本身已正确写入(filename
)。无论您想在代码中继续使用 CSV,数组的数组都是您的选择。
希望对您有所帮助。
我猜你的 normalized_data
要么是像 [[['a', 'b'],['c', 'd']]]
这样的三重数组,要么是像 ['a', 'b', 'c']
.
这样的平面数组
应该是[['a', 'b', 'c'],['d', 'e', 'f']]
这样的数组数组。
或平面阵列
你的 normalized_data 应该看起来像 [['a', 'b', 'c']
使用此代码:
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
我在 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
并打开它,所有内容都被塞进一个很长的行,以 [[
开头,这意味着所有内容似乎都包含在一个数组中......
为什么是这样?我很困惑,我花了几个小时试图解决这个问题。
Ps。
#tmp_csv
被注释掉了,因为该策略也不起作用,但最终我想创建的是一个临时文件。
如有任何帮助,我们将不胜感激。
更多信息编辑:
正如我所说,filename
实际上在我的系统中创建得很好,但是我随后尝试使用 Dropbox API 中的 put_file 方法将此文件上传到 Dropbox,并且当我在 Dropbox 中打开它,所有内容都在一行中。
我上传的方式是:
client.put_file("#{DROPBOX_PATH}/example_file_#{Time.now}.csv", file_name)
当我在保管箱中打开它时,所有内容都在一行中。
这是我的 normalized_data
的样子,我相信这很好:
[["text",
"text",
"text",
"2016-02-09",
3,
"text",
{},
false,
"text",
{"text"=>{}, "text"=>1},
["text", "text", "text"],
"text",
{"text"=>"text", "text2"=>{}}],
...
...
按原样保存 new_csv
没有任何意义,因为它是 CSV.open(filename, 'w')
的结果。是的,它是一个数组数组,它是 CSV 在 ruby 中的表示方式(一个行数组,每一行都是一个列数组。)
不清楚,为什么要尝试直接保存new_csv
。基本上,此操作将上述数组数组转换为字符串并将此字符串存储在文件中。
正如您所指出的,CSV 本身已正确写入(filename
)。无论您想在代码中继续使用 CSV,数组的数组都是您的选择。
希望对您有所帮助。
我猜你的 normalized_data
要么是像 [[['a', 'b'],['c', 'd']]]
这样的三重数组,要么是像 ['a', 'b', 'c']
.
应该是[['a', 'b', 'c'],['d', 'e', 'f']]
这样的数组数组。
或平面阵列
你的 normalized_data 应该看起来像 [['a', 'b', 'c']
使用此代码:
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