【问题标题】:R read.table csv with classic-mac line endingsR read.table csv,带有经典-mac行尾
【发布时间】:2012-02-06 19:45:09
【问题描述】:

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

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

等等。我相信这意味着我的 CSV 仅使用 CR(经典 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)。

【问题讨论】:

  • 或者,如果 R 应该能够优雅地处理 mac 行尾,我会知道我还有另一个问题......

标签: r csv line-endings


【解决方案1】:

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 的参数gsub

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

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

去除 DOS ctrl-M's:

:1,$ s/{ctrl-V}{ctrl-M}//

【讨论】:

  • 是的,^M 只是 vim 的 CR 占位符。而且,在仔细查看我的错误后,发现我的问题在转换为 LF 后仍然存在:我只需要首先设置 fill=T :#
  • 啊,旧的可变长度行问题。 count.fields 函数非常适合该问题。
【解决方案2】:

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

比如说你的Mac文件(返回的^M)格式保存为test.csv,加载如下:

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

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

这是最好和最干净的方法。

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多