Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将2D数组从控制台复制到CSV/Excel文件中并正确处理换行符和分隔符_Ruby_Csv_Spreadsheet - Fatal编程技术网

Ruby 如何将2D数组从控制台复制到CSV/Excel文件中并正确处理换行符和分隔符

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

想法是这样的:我有一个2D数组,其中包含带有换行符的非转义字符串\n,有时甚至还有充当CSV分隔符的字符,如

我需要能够轻松地将这些数据从远程Ruby控制台的输出复制并粘贴到本地Excel文件或在线Google电子表格中

在我使用以下命令遇到带有换行符和分号的数据之前,它一直工作正常:

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'