Ruby如何将二维数组转换为CSV?

5
有一个数组,如何正确地将其输出到csv文件中?
arr1 = [["A","B"], ["C","D"], ["E","F"], ["G","H"]]

期望在csv中的结果:

A,B
C,D
E,F
G,H

I do so:

out_file = File.open('file.csv', 'w')
arr1.each_index do |inx|
  arr1[inx].each do |val|
    out_file.puts val
  end
end

但是,所有内容都在一列中打印出来:

A
B
C
D
..

如果你通过p val输出到控制台,那么每个值都会有/r:
"A\r"
"B\r"
"C\r"
"D\r"

我做错了什么?

编辑: 结果CSV Excel 结果CSV Vim


@DenisDerevyankin 我认为“将所有值输出到一个单元格中”与您提供的预期结果不符。 - Andrey Deineko
@mudasobwa 再次在一列中,但现在前面有(“,”) - qskyhigh
我不明白。我提供的代码完全按照你的要求生成了结果。 - Aleksei Matiushkin
@mudasobwa https://i.stack.imgur.com/50p2O.png - qskyhigh
我不知道这个GUI工具是用来做什么的,通常检查CSV文件时,人们会在任何文本编辑器中打开生成的文件,比如vim或者emacs - Aleksei Matiushkin
显示剩余4条评论
3个回答

6

没有将内容写入文件。

require 'csv'
CSV.open('file.csv', 'w') do |csv|
  arr1.each { |ar| csv << ar }
end

"<<': undefined method `map' for #String:0x00000002405ea0" - qskyhigh
@DenisDerevyankin 我编辑了答案,不再有 map 方法。 - Andrey Deineko
这个不行。CSV#<< 接受 CSV::Row 或者 Array,但是你传递了一个 StringCSV#<< 会尝试将元素映射到 CSV,但是会抛出一个 NoMethodError: undefined method \map' for "A, B":String` 的错误。 - Jörg W Mittag
工作,但是一个列 A ,B ,C ,D 可以用于每个 chomp 的值吗? - qskyhigh
@DenisDerevyankin 我不理解你的评论是什么意思。 - Andrey Deineko
@Andrey Deineko,我发布了图片,是你代码工作的结果。也许是我做错了什么? - qskyhigh

4
如果你只是想简单地打印CSV字符串,那么可以按如下方式操作:
csv_string = CSV.generate { |csv| array2d.each { |row| csv << row }

以下是一个实例:

这里有一个示例:

> # array2d contains the raw data
> csv_string = CSV.generate { |csv| array2d.each { |row| csv << row } }
> puts csv_string
5014,"John O""Neill",4295,1,Finance Plus
314,"Thomas, Duncan",436,2,Finance Plus
1930,Fraser Smith,436,12,Finance Plus
5057,Fred McDonald,436,12,Finance Plus

请注意,它处理字符串中的双引号和逗号。
参见:https://ruby-doc.org/stdlib-2.6.1/libdoc/csv/rdoc/CSV.html

0

它有效了,

require 'csv'
CSV.open('file.csv', 'w') do |csv|
  arr1.each { |ar| csv << ar }
end

但必须在它前面完成:

 arr1.each_index do |inx|
    arr1[inx].each do |val|
    val.chop!    
  end
 end

要删除换行符\r

它可以正常工作:

File.write('file.csv', [["A","B"], ["C","D"], ["E","F"], ["G","H"]].map { |e| e.join(",") }.join($/))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接