Ruby 2.0 CSV阅读器以不同的方式处理Microsoft Excel生成的CSV文件,而不会去除控制字符

问题: Mac上的Ruby 2.0 CSV阅读器Mavericks将Microsoft Excel生成的CSV文件以不同方式embeddedHTML。 用FasterCSV在Ruby 1.8上运行良好。

我刚刚将我的Mac升级到了Mavericks(OS X 10.9.4),并将Ruby升级到了2.0.0p451(我曾经使用Ruby 1.8+和FasterCSV gem,但是现在使用的是Ruby 2.0以及原生CSV)。

ruby版本:

ruby -v ruby 2.0.0p451 (2014-02-24 revision 45167) [universal.x86_64-darwin13] 

CSV文件是从Office 2011生成的,从原始的“.xlsx”文件保存。

下面的HTML包含在Microsoft .xlsx文件的单个单元格中,然后将其保存为CSV …

 <h1 style="text-align:center; font: bold 1.5em Arial;">This is the Title</h1> <p style="text-align:center;"><img style="width:300px; height:100px" src="./IMAGES/MAIN/image1.png" alt="Image 1"/></p> <p style="text-align:center;">This is a sentence.</p> 

还有其他单元格,也embedded了HTML代码。

重现…

  1. 打开一个Excel工作表
  2. 将上面的HTML复制到单元格A1(确保有Mac回车控制+命令+ HTML结构之间的返回(例如在“h1”结构的结尾和新的“p”结构的开始之间),以确保行在所有完整的HTML结构之间切换,就在Excel单元格中。
  3. 将单元格A1中的内容复制到单元格A1正下方的单元格A2,以确保多个CSV行(您的文件将有两个正式的CSV行)。
  4. 首先将文件保存为xlsx文件(例如“file.xlsx”)
  5. 然后将工作表保存为CSV文件(例如“file.csv”)。

您现在将拥有一个Excel生成的CSV文件,该文件有两个正式的CSV行,其中每行都有多个由行提要分隔的HTML构造。

读取CSV文件…

我使用下面的代码来读取CSV文件,并在我试图去除控制字符之前和之后打印每个单元格的内容…

 arrayOfHtmlConstructs = CSV.read( file.csv ) arrayOfHtmlConstructs.each_with_index do | construct, i| output = "" << construct.to_s puts "BEFORE: " << output output = output.gsub(/\r/, "") # Replace Microsoft carriage returns FAILS! output = output.gsub(/\\"/, "\"") # Replace escaped quotes with quotes WORKS FINE! output = output.gsub(/\[\"/, "") # Remove prefix [" WORKS FINE! output = output.gsub(/\"\]/, "") # Remove suffix "] WORKS FINE! puts "AFTER: " << output end 

试图剥离代码之前,CSVstring“ 输出 ”如下所示…

 BEFORE: ["<h1 style=\"text-align:center; font: bold 1.5em Arial;\">This is the Title</h1>\r<p style=\"text-align:center;\"><img style=\"width:300px; height:100px\" src=\"./IMAGES/MAIN/image1.png\" alt=\"Image 1\"/></p>\r<p style=\"text-align:center;\">This is a sentence.</p>"] 

你会注意到,它包括[“在开始和结束”,以及逃脱报价和embedded式回车/ R

问题:所有的gsub语句除了试图用空格replace所有回车符的语句之外都是有效的。

运行Ruby脚本后,string“ 输出 ”看起来如下所示,其中一切正常replace,除了回车…

 AFTER: <h1 style="text-align:center; font: bold 1.5em Arial;">This is the Title</h1>\r<p style="text-align:center;"><img style="width:300px; height:100px" src="./IMAGES/MAIN/image1.png" alt="Image 1"/></p>\r<p style="text-align:center;">This is a sentence.</p> 

出于某种原因,回车没有被replace/replace。

另外,在升级到Ruby 2.0之前,我曾经使用FasterCSV,并且不需要任何replace语句。 一切正常。

任何想法,为什么这一切都发生,如何妥善处理呢? 任何援助非常感谢。

我的答案的范围已经改变,所以我已经编辑了只是正则expression式,因为这似乎是更多的主题。

我已经更新了我的expression式来覆盖所有的replace,只需更新以下代码块即可:

 arrayOfHtmlConstructs.each_with_index do | construct, i| output = "" << construct.to_s puts "BEFORE: " << output output = output.gsub(/\\"/, "\"") # Replace escaped quotes with quotes WORKS FINE! output = output.gsub(/(\\r|\[|\])/, "") puts "AFTER: " << output end 

尝试这个:

 @csv = CSV.read(params[:file].path, headers: true, skip_blanks: true, encoding:'windows-1256:utf-8') 

您需要执行Microsoft CSV编码