Ruby中的通用换行支持,包括\ r(CR)行结尾
在Rails应用程序中,我接受并解析可能使用三种可能的行终止字符格式化的CSV文件: \n
( LF
), \r\n
( CR+LF
)或\r
( CR
)。 Ruby的File
和CSV
库似乎可以很好地处理前两种情况,但最后一种情况(“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,所以谁知道你最终会处理什么样的疯狂废话。