有效地读取R中非常大的文本文件

时间:2015-10-07 22:18:00

标签: r import bigdata

我有一个非常大的文本文件,其中有数百万行包含像这样的人口普查数据

83400081732734890
2873846391010001944545
1829304000292399445
934745875985958344552
40599505500505055
3457584947597594933332
3938493840333398333
444234432346777927272
...

每一行都包含一组基于给定宽度分隔的变量。在上面的例子中,四行一起设置了一份完整的调查问卷。因此,该示例显示了两个完整的问卷/两个访问过的家庭。

我想要做的是只阅读每个家庭的特定变量,因为阅读整个文件需要花费太多时间。因此,我想只读取文件中的特定行,而不将其完全加载到内存中。

假设我只对4行每个块的第1行和第3行中包含的变量感兴趣,我怎样才能强制R只读取第1,3,5,7行?

并且:除了只阅读相关的行之外,是否可以将读取限制在包含相关信息的每行的特定块中?比如说我想只读第一行(834和405)的前三位数和第三行(99445和98333)的最后五位数?

修改

由于我想有选择地阅读所提供的解决方案here并不能解决我的问题。此外,由于我在没有管理权限的Windows 7工作站上工作,因此无法设置SQL数据库。我可以使用Powershell或类似的命令行工具。

1 个答案:

答案 0 :(得分:2)

如果origianl文件足够规则,=IF(G23=TRUE,0,4)函数可以处理多行输入。但是,对于可变记录长度,这并不好。

scan

另一种方法是使用 res <- scan(text="83400081732734890 2873846391010001944545 1829304000292399445 934745875985958344552 40599505500505055 3457584947597594933332 3938493840333398333 444234432346777927272 ", what=list(one="", two="", three="", four="")) # one list element per , line; # use "" for text Read 2 records > first <- lapply(res[1], substr, 1, 3) > first $one [1] "834" "405" > third <- lapply(res[3], function(x) substr(x , nchar(x)-4, nchar(x))) > third $three [1] "99445" "98333" 阅读,然后让您以不规则的间隔选择分区标记。