Ruby 如何将2D数组从控制台复制到CSV/Excel文件中并正确处理换行符和分隔符
想法是这样的:我有一个2D数组,其中包含带有换行符的非转义字符串\n,有时甚至还有充当CSV分隔符的字符,如 我需要能够轻松地将这些数据从远程Ruby控制台的输出复制并粘贴到本地Excel文件或在线Google电子表格中 在我使用以下命令遇到带有换行符和分号的数据之前,它一直工作正常:Ruby 如何将2D数组从控制台复制到CSV/Excel文件中并正确处理换行符和分隔符,ruby,csv,spreadsheet,Ruby,Csv,Spreadsheet,想法是这样的:我有一个2D数组,其中包含带有换行符的非转义字符串\n,有时甚至还有充当CSV分隔符的字符,如 我需要能够轻松地将这些数据从远程Ruby控制台的输出复制并粘贴到本地Excel文件或在线Google电子表格中 在我使用以下命令遇到带有换行符和分号的数据之前,它一直工作正常: class Array def puts_csv map { |row| row.join(';') }.each(&method(:puts)) end end [["A1", "B
class Array
def puts_csv
map { |row| row.join(';') }.each(&method(:puts))
end
end
[["A1", "B1"], ["A2", "B2"], ["A3", "B3"]].puts_csv
# =>
A1;B1;
A2;B2;
A3;B3;
在控制台上输出一个列表,我可以很容易地复制/粘贴到我的电子表格应用程序中并选择它;作为输入分隔符
但现在我必须处理包含应该转义字符的字符串输入,如逗号、分号或换行符。这完全破坏了我对数据的复制/粘贴
样本数据:
array2D = [
["name", "school", "comment"],
["Jean François", "ENS", "Lorem ipsum dolor sit amet; consectetur,\nadipiscing elit, sed do eiusmod tempor"
]
我当前的方法给出三行,因为它使用分号分隔符分隔行:
name;school;comment
Jean François;ENS;Lorem ipsum dolor sit amet;consectetur,
adipiscing elit, sed do eiusmod tempor
目标可以是如下所示:
name;school;comment
Jean François;ENS;"Lorem ipsum dolor sit amet; consectetur,
adipiscing elit, sed do eiusmod tempor"
多亏了,我意识到有一个处理换行符的技巧,首先复制到一个带有转义引号的超文本文件,然后在Excel中打开它
直接将这些数据复制到电子表格中仍然很困难,因为换行符仍然被视为新行
这段代码是从远程服务器生成的,而我需要在本地电子表格中加载数据。由于几个原因,通过FTP或SMTP交换文件并不方便。这只是很少发生的事情,因此不值得向代码库添加代码来处理此类导出,因此我主要依靠控制台补丁轻松导出一些数据
对于常规导出,我们在其他应用程序中有一些代码
如何生成可以轻松粘贴到电子表格中的控制台输出?使用Ruby:
代码变化很小,CSV为您完成了所有繁重的工作,包括正确的转义和引用。但是,粘贴此内容可能会使您在Excel中出错-详细信息可能取决于您当前的代码页、Excel的区域设置等。请将其保存到一个文件中,并在开始处使用BOM:file。编写'foo.csv',\ufeff+csv,编码:'utf-8'并将其从Excel导入应该更好。使用gem:
有关更多信息,请参阅。直接生成一个CSV文件,然后将该文件导入电子表格如何?然后,您可以使用Ruby CSV类之类的东西,它将为您处理所有这些转义操作……甚至,为什么不直接写入电子表格文件呢?您要求我们修复一个不好的解决方案-为什么不改用一个好的解决方案呢?请在用英语写作时使用英语标点符号,而不是法语标点符号。@Casper即使我生成了一些CSV文件,然后我需要找到一些方法通过电子邮件发送或通过FTP下载,这有点不方便我从远程服务器生成这些数据,并让其他人(不一定是开发人员)使用这些命令,我将编辑我的问题以反映这一点。当我执行代码并尝试将rails控制台的输出复制粘贴到某个excel工作表时,它会生成3行。但是,您关于先保存到某个文件的建议奏效了:我通过升华文本将puts csv输出从远程控制台复制到本地空文件,然后用excel打开该文件,结果只导入了两行内容。您的另一个建议是使用编码utf-8和BOM保存上述文件,这有助于解决macOS上的编码问题。非常感谢。
array2D = [
["name", "school", "comment"],
["Jean François", "ENS", "Lorem ipsum dolor sit amet, consectetur,\nadipiscing elit, sed do eiusmod tempor"]
]
csv = CSV.generate(col_sep: ';') do |csv|
array2D.each do |row|
csv << row
end
end
puts csv
#!/usr/bin/ruby
require 'spreadsheet'
array2D = [
["name", "school", "comment"],
["Jean François", "ENS", "Lorem ipsum dolor sit amet, consectetur,\nadipiscing elit, sed do eiusmod tempor" ]
]
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet(:name => 'AAA')
fmt = Spreadsheet::Format.new :text_wrap => true
i=0
j=0
array2D.each do |row|
row.each do |cell|
sheet1[i,j] = cell
if cell.include? "\n"
sheet1.row(i).set_format(j, fmt)
end
j = j+1
end
j=0
i=i+1
end
book.write 'test2.xls'