R read.table csv with classic-mac 行结尾

标签 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(经典 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 不会将“^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”作为 gsubpatt 参数。

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

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

去除 DOS ctrl-M:

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

关于R read.table csv with classic-mac 行结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9166214/

相关文章:

r - 尝试从 R 中的基因序列返回指定数量的字符

python - 检测折线图分段的正确算法是什么?

python - CSV 在列中写一个列表

java - 将 csv 文件上传到服务器,然后从中读取

python - 删除字符串中重复的换行符

r - 如何使用 ggplot 或plotly 创建每个条形包含多个 x 变量的条形图?

r - 方括号多列 R

c# - 数据行到 CSV 行 C#

git - 如何使git理解Mac(CR)行尾

linux - 如何配置 bash 来处理 CRLF shell 脚本?