2015-10-07 71 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