问题: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 代码。
重现...
- 打开 Excel 工作表
- 将上述 HTML 复制到单元格 A1(确保 HTML 结构之间有 Mac 回车符 control+command+return(例如,在“h1”结构的末尾和新的“p”结构的开始之间,按顺序确保所有完整 HTML 结构之间的换行符,就在 Excel 单元格中。
- 将单元格 A1 中的内容复制到单元格 A2,就在单元格 A1 的正下方,以确保多个 CSV 行(您的文件将有两个正式的 CSV 行)。
- 首先将文件保存为 xlsx 文件(例如“file.xlsx”)
- 然后将工作表保存为 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/