高效地在R中读取大文本文件

9 浏览
0 Comments

高效地在R中读取大文本文件

这个问题已经有了答案

快速将非常大的表格作为数据框读取

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

83400081732734890
2873846391010001944545
1829304000292399445
934745875985958344552
40599505500505055
3457584947597594933332
3938493840333398333
444234432346777927272
...

每一行包含一组根据给定宽度分隔的变量。在上面的例子中,四行组合在一起形成了一个完整的调查问卷,因此该例子显示了两个完整的调查问卷/两个受访家庭。

我想做的是读取每个家庭中的特定变量,因为读取整个文件需要太长时间。因此,我想仅读取文件中的特定行,而不必在内存中完全加载它。

比方说,我只对每个块的第1和第3行中包含的变量感兴趣,那么我如何强制R仅读取第1、3、5、7行?

还有:除了只读取相关行外,是否有可能进一步限制读取每行包含相关信息的特定部分?比如说,我想从第一行(834和405)仅读取前三个数字,从第三行的最后五个数字(99445和98333)仅读取最后五个数字?

编辑

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

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"

另一种方法是使用readLines进行读取,然后在不规则的间隔处选择分割标记。

0