在Rails应用程序中,我接受并解析可能使用三种可能的行终止字符格式化的CSV文件:\n
(LF
),\r\n
({{ 1}})或CR+LF
(\r
)。 Ruby的CR
和File
库似乎可以正常处理前两种情况,但最后一种情况(“Mac经典”CSV
行结尾)不作为换行处理。能够接受这种格式以及其他格式非常重要,因为Microsoft Excel for Mac(在OS X上运行)似乎在导出到“逗号分隔值”时使用它(尽管导出到“Windows逗号分隔”使得更容易处理\r
)。
Python具有“通用换行支持”,可以毫无问题地处理这三种格式中的任何一种。在Ruby中是否有类似的东西可以在不事先知道格式的情况下接受所有三个?
答案 0 :(得分:18)
您可以使用:row_sep => :auto
:
<强>:row_sep 强>
字符串附加到每行的末尾。这可以设置为特殊:auto
设置,该设置请求CSV自动从数据中发现此设置。自动发现会在数据中提前读取下一个"\r\n"
,"\n"
或"\r"
序列。
当然有一些注意事项,请参阅上面链接的手册了解详情。
在将数据交给CSV进行解析之前,您还可以使用gsub
来手动清理EOL。在尝试解析CSV之前,我可能会采用此路由并手动将所有\r\n
和\r
转换为单\n
。 OTOH,如果你的CSV中有嵌入的二进制数据\r
意味着什么,这将无法正常工作。在抓狂的手上,这是我们正在处理的CSV,所以谁知道你最终会处理什么样的疯狂废话。