R read.table csv with classic-mac line endings

时间:2012-02-06 19:45:10

标签: r csv line-endings

当我在vim中打开它时,我有一个逗号分隔的值文件,如下所示:

12,31,50,,12^M34,23,45,2,12^M12,31,50,,12^M34,23,45,2,12^M

等等。我相信这意味着我的CSV使用CR-only(经典mac)行结尾。 R的read.table()函数表面上需要LF行结尾或其某些变体。

我知道我可以预处理文件,这可能就是我要做的。

除了解决方案:有没有办法将CR文件直接导入R?例如,write.table()有一个“eol”参数可用于指定输出的行结尾 - 但我没有看到read.table()的类似参数(参见http://stat.ethz.ch/R-manual/R-patched/library/utils/html/read.table.html

2 个答案:

答案 0 :(得分:4)

R不会将“^ M”识别为任何有用的东西。(我想有可能vim只是向你显示一个cntrl-M作为那个角色。)如果那是在文本连接流中R会认为它不是一个有效的转义字符,因为“^”不用于此目的。您可能需要进行预处理,除非您想通过scan()传递并使用gsub()替换:

subbed <- gsub("\\^M", "\n", scan(textConnection("12,31,50,,12^M34,23,45,2,12^M12,31,50,,12^M34,23,45,2,12^M"), what="character"))
Read 1 item

> read.table(text=subbed, sep=",")
  V1 V2 V3 V4 V5
1 12 31 50 NA 12
2 34 23 45  2 12
3 12 31 50 NA 12
4 34 23 45  2 12

我想您可能需要使用“\\ m”作为patt的{​​{1}}参数。

进一步说明:扫描的帮助页面说:“无论打开什么模式的连接,LF,CRLF或CR中的任何一个都将被接受作为行的EOL标记,因此将匹配sep =”\ n“ “。因此,gsub基于read.table,因此应该已经识别换行符(“\ n”,如果它们是这样的话)。您应该查看?有关转义字符的信息的报价。

如果认为这个vim tutorial可能是与DOS相关的字符,因为它提供了这个建议:

剥离DOS ctrl-M:

scan

答案 1 :(得分:0)

有一个R本机解决方案,不需要预处理或外部黑客攻击。您应该对encoding函数使用read.table输入参数,并将其设置为等于"latin1"的Mac字符编码。

例如,假设Mac中的文件(^ M表示返回)格式保存为test.csv,加载如下:

 test <- read.table("./test.csv", sep=",", encoding="latin1")

要查看哪些选项可以将encoding参数类型?Encoding传递到R解释器,您会看到"latin1""UTF-8""bytes"或{ {1}}是受支持的编码。

这是最好的&amp;最干净的方式来做到这一点。