html - Ruby 2.0 CSV 阅读器以不同方式处理 Microsoft Excel 生成的 CSV 文件并且不剥离控制字符

标签 html ruby excel csv gsub

问题:Mac Mavericks 上的 Ruby 2.0 CSV 阅读器以不同方式处理 Microsoft Excel 生成的嵌入了 HTML 的 CSV 文件。使用 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 保存为 CSV 之前,它包含在 Microsoft .xlsx 文件的单个单元格中...

<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>

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

重现...

  1. 打开 Excel 工作表
  2. 将上述 HTML 复制到单元格 A1(确保 HTML 结构之间有 Mac 回车符 control+command+return(例如,在“h1”结构的末尾和新的“p”结构的开始之间,按顺序确保所有完整 HTML 结构之间的换行符,就在 Excel 单元格中。
  3. 将单元格 A1 中的内容复制到单元格 A2,就在单元格 A1 的正下方,以确保多个 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

在尝试剥离代码之前,CSV 字符串“output”如下所示...

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>"]

您会注意到它在开头包含 [",在结尾包含 ]",以及转义引号和嵌入的回车符/r

问题:除了试图用空格替换所有回车的语句外,所有 gsub 语句都有效。

运行 Ruby 脚本后,字符串“output”如下所示,其中所有内容都被正确替换,除了回车...

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>

出于某种原因,回车没有被替换/替代。

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

关于为什么会发生这一切以及如何正确处理它有什么想法吗?非常感谢任何帮助。

最佳答案

我的回答范围发生了变化,所以我只编辑了正则表达式,因为它似乎更切合主题。

我已经更新了我的表达式以涵盖您的所有替换,只需使用以下代码块进行更新:

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

关于html - Ruby 2.0 CSV 阅读器以不同方式处理 Microsoft Excel 生成的 CSV 文件并且不剥离控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24544175/

相关文章:

ruby - 如何将科学计数法字符串转换为十进制计数法?

ruby-on-rails - 如何使用 Ruby 获取网站 (url) cookie 列表

excel - getElementById 在 VBA 中不起作用,错误 438

javascript - 向上时停止发生滚动效果

javascript - 在鼠标悬停时添加叠加

html - 网站在不同宽度的 PC 上看起来不错,但在手机上就坏了

ruby-on-rails - "Rake spec"大多数测试失败,但 "rails s"在 Diaspora 源上工作正常

java - WorkbookFactory.create(inputStream)

excel - 过滤精确匹配并从范围中提取标准

html - 无序列表导航栏元素有奇怪的差距