有效地读取 R 中的一个非常大的文本文件 [重复]
Posted
技术标签:
【中文标题】有效地读取 R 中的一个非常大的文本文件 [重复]【英文标题】:Read a very large textfile in R efficiently [duplicate] 【发布时间】:2016-01-05 08:12:24 【问题描述】:我有一个非常大的文本文件,其中包含数百万行包含这样的人口普查数据
83400081732734890
2873846391010001944545
1829304000292399445
934745875985958344552
40599505500505055
3457584947597594933332
3938493840333398333
444234432346777927272
...
每一行都包含一组根据给定宽度分隔的变量。在我上面的示例中,四行一起设置了一份完整的调查问卷。因此,该示例显示了两个完整的问卷/两个访问的家庭。
我想做的是只读取每个家庭的特定变量,因为读取整个文件需要太多时间。因此,我想只读取文件中的特定行而不将其完全加载到内存中。
假设我只对包含在每个 4 行块的第 1 行和第 3 行中的变量感兴趣,我怎么能强制 R 只读取第 1、3、5、7 行?
并且:除了只阅读相关行之外,是否可以进一步限制阅读到包含相关信息的每一行的特定块?比如说我只想读取第一行的前三位(834 和 405)和第三行的后五位(99445 和 98333)?
编辑
由于我想有选择地阅读here 提供的解决方案,因此不能解决我的问题。此外,我无法设置 SQL 数据库,因为我在没有管理权限的 Windows 7 工作站上工作。我确实可以使用 Powershell 或类似工具中的命令行工具。
【问题讨论】:
@EricJ。 - 不确定它是否与那个重复。这增加了选择某些块/行的要求。也许使用命令行工具(awk、sed 等)在 R 之外处理文件可能是有益的? 【参考方案1】:如果原始文件足够规则,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
读取,然后您可以选择不规则间隔的分割标记。
【讨论】:
效果稍好一些。谢谢!!以上是关于有效地读取 R 中的一个非常大的文本文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章