【问题标题】:Read text file with separator longer than one character with fread用 fread 读取分隔符长于一个字符的文本文件
【发布时间】:2015-11-13 14:22:07
【问题描述】:

有没有办法让 data.table fread 读取带有"|||" 等分隔符的文本文件?

我有一个文本文件 (2GB),其中的行看起来像

aaa|||bbb|||random characters !$^!$£"!$ contain single |. |||other cols

如果无法使用fread,还有其他建议吗?最后我会让他们进入data.table。

【问题讨论】:

  • 先fread(),然后用strsplit()分割字符串
  • 或 read.table(sep="|||") 然后 setDT?
  • @Heroka,我尝试了 read.table 但这给出了类似的错误invalid 'sep' value: must be one byte
  • 也许这篇文章对stackoverflow.com/questions/18186357/…有帮助
  • 对此没有本机支持。如果在 *nix 上,fread("sed 's/|||/,/g' yourfile") 是你最好的选择。

标签: r data.table


【解决方案1】:

readr 包中的命令 read_delim 支持多个字符的分隔符。

我运行了一些基准测试(160 万行、30 列、350 mb txt 文件)。

我发现它比通过以下方式使用strsplit 的解决方案快大约 40%:

do.call(rbind,strsplit(readLines('test.txt'),'~~~',fixed=T))

如果你为windows安装gawk并在windows中设置合适的系统路径,你也可以这样做:

fread("sed 's/|||/,/g' yourfile", sep = ',')

正如 eddi 在 cmets 中所建议的那样。这比 read_delim 解决方案慢了大约 20%,因为它必须通过调用 sed 写入一个临时文件,但比基本 R 解决方案快。

最快的解决方案是使用 fread 和 sep = '|' 并自己删除重复的列。如果您先验地知道它们在哪里,这种方法效果最好,否则可以计算出来(可能需要一些不平凡的时间成本)。

我无法让fread 和tstrsplit 完成我的数据集,但你可能会遇到更好的运气。

【讨论】:

  • 可以通过打开到 sed 输出的文本连接来提高 sed 的性能,这样 fread 就不必写入(和读取)临时文件。
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2023-03-31
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多