使用fread读取已对齐的列数据

6
我发现了这样一个文件:

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

我无法直接使用 fread 加载它,因此我使用 sed\s+ 替换为 ,,然后再将其提供给 fread,这样解决了问题。但是有没有一种内置的方法可以使用 data.table 读取这种类型的数据呢?


df <- read.table('test.dat',header=T) 这个怎么样? - RHertel
2个回答

3

fread目前还没有读取固定宽度文件的功能。

我也经常遇到存储方式很烦人的文件。请在Github页面上添加一个功能请求吧。

也许在你的情况下不是这样,但是使用sed解决方案在我遇到的很多FWF上都无法工作,因为列之间没有空格,例如你会看到像00010这样的字符串实际上包含3个字段。

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

  1. R中的read.fwf
  2. 编写一个fwf->csv程序(我使用自己编写的Python程序,速度很快,如果您愿意,我可以分享代码)--基本上是初始方法的加强版,因此您永远不必再处理FWF了
  3. 在Excel / LibreOffice /等中打开它;有一个本地的FWF阅读器会尝试(通常很差)猜测列的宽度,这至少完成了指定列宽的一半工作。然后您可以从那里将其保存为.csv或其他格式。

我个人最常使用第二个选项。 read.fwf没有像fread那样进行优化,因此它可能会很慢。如果您需要读取大量(例如20个以上)的FWF,则第三个选项非常繁琐。

但是我同意内置类似于fread的功能会很好。


(稍微臃肿的)代码可以在我的存储库中找到;我认为这并不是特别新颖的东西... - MichaelChirico
1
@statquant,来自“readr”包的read_fwf比基本R的read.fwf快得多(尽管无法接近fread的速度)。 - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto,感谢你提醒!工具包版本已升级 B-) - MichaelChirico

1

最近已在当前开发版(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文件以获取最新消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接