Ruby中的通用换行支持,包括\ r(CR)行结尾

在Rails应用程序中,我接受并解析可能使用三种可能的行终止字符格式化的CSV文件: \nLF ), \r\nCR+LF )或\rCR )。 Ruby的FileCSV库似乎可以很好地处理前两种情况,但最后一种情况(“Mac classic” \r行结尾)不作为换行处理。 能够接受这种格式以及其他格式非常重要,因为Microsoft Excel for Mac(在OS X上运行)似乎在导出到“逗号分隔值”时使用它(尽管导出到“Windows逗号分隔”使得更容易处理\r\n )。

Python具有“通用换行支持”,可以毫无问题地处理这三种格式中的任何一种。 在Ruby中是否有类似的东西可以在不事先知道格式的情况下接受所有三个?

你可以使用:row_sep => :auto

:row_sep
字符串附加到每行的末尾。 这可以设置为特殊:auto设置,请求CSV自动从数据中发现此信息。 自动发现在数据中向前读取,寻找下一个"\r\n""\n""\r"序列。

当然有一些注意事项,请参阅上面链接的手册了解详情。

在将数据传递给CSV进行解析之前,您还可以使用一些gsub手动清理EOL。 在尝试解析CSV之前,我可能会采用这种方法并手动将所有\r\n s和\r \r\n转换为单个\n s。 OTOH,如果你的CSV中有嵌入的二进制数据,那么这将无法正常工作。 \r s意味着什么。 在抓狂的手上,这是我们正在处理的CSV,所以谁知道你最终会处理什么样的疯狂废话。