使用 fread 读取对齐的列数据

Reading aligned column data with fread

我遇到了这样一个文件:

COL1        COL2          COL3
weqw        asrg          qerhqetjw
weweg       ethweth       rqerhwrtjw
rhqerhqerhq qergqer       qerhqew5h
qerh        qergqer       wetjwryerj

我无法用 fread 直接加载它,所以我将 \s+ 替换为 ,sed 而不是我给 fread 并解决了它。但是有没有一种内置的方法可以用 data.table 读取这种数据?

fread(还)没有任何阅读能力fixed-width files

我也经常遇到像这样烦人地存储的文件。欢迎在 Github page.

上添加功能请求

在你的情况下可能不是这样,但是你的 sed 解决方案不适用于我遇到的很多 FWF,因为列之间没有 space,例如你会看到像 00010 这样的字符串实际上包含 3 个字段。

如果是这种情况,您将需要一个字段宽度字典,此时您有多种选择:

  1. read.fwf R
  2. 以内
  3. 写一个fwf->csv程序(我用的是我在Python写的,速度很快,如果你愿意可以分享代码)——基本上您初始方法的增强版本,这样您就不必再处理 FWF
  4. 在 Excel / LibreOffice / 等中打开它;有一个本机 FWF reader 尝试(通常很差)猜测列的宽度,这至少完成了为您指定列宽的一半工作。然后您可以将其另存为 .csv 或其他格式。

我个人最常坚持第二种选择。 read.fwf 没有像 fread 那样优化,所以它可能会很慢。如果你有很多(比如 20+)FWF 需要阅读,那么第三个选项就相当乏味了。

但我同意在 fread 中内置这样的东西会很好。

最近在当前开发 (v1.9.5) 中修复。请升级并测试(如有任何问题请报告)。

require(data.table) # v1.9.5+
fread("~/Downloads/tmp.txt")
#           COL1    COL2       COL3
# 1:        weqw    asrg  qerhqetjw
# 2:       weweg ethweth rqerhwrtjw
# 3: rhqerhqerhq qergqer  qerhqew5h
# 4:        qerh qergqer wetjwryerj

fread() 在其他参数中获得了 strip.white 个参数(默认值=TRUE)。请查看项目页面上的 README 以获取最新消息。