2015-10-07 119 views
1

我有包含像这样阅读R中一个非常大的文本文件有效

83400081732734890 
2873846391010001944545 
1829304000292399445 
934745875985958344552 
40599505500505055 
3457584947597594933332 
3938493840333398333 
444234432346777927272 
... 

每一行包含了一组基于给定的宽度分离变量人口普查数据几百万线verly大的文本文件。在上面的例子中,四行共同构成了一份完整的调查问卷。因此这个例子显示了两个完整的问卷/两个访问过的家庭。

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

可以说我只对4行每块的第1行和第3行中包含的变量感兴趣,我怎么能强迫R只读取第1,3,5,7行?

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

编辑

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

+0

@EricJ。 - 不知道它是那个的重复。这增加了选择某些块/线的要求。也许使用命令行工具(awk,sed等)处理R以外的文件可能会有所帮助? – thelatemail

回答

2

如果origianl文件足够规则,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

的效果稍好。谢谢!! – user2383726