熱線電話:13121318867

登錄
首頁精彩閱讀R實現大文本文件數據過濾的方法
R實現大文本文件數據過濾的方法
2018-07-09
收藏

R實現大文本文件數據過濾的方法

使用R語言過濾文件數據是很普遍的操作,但有時我們會遇到比較大的文件,這類文件無法全部讀入內存處理,需要采用分批讀取、分批過濾、拼合結果的辦法來解決。下面用一個例子來說明R實現大文件數據過濾的方法。

有個1G的文件sales.txt,存儲著大量訂單記錄,請過濾出AMOUNT字段值在2000和3000之間的記錄。該文件的列分割符為“\t”,前幾行數據如下:

R語言解決方案

con <- file("E:\\sales.txt", "r")
readLines(con,n=1)
result=read.table(con,nrows=100000,sep="\t")
result<-result[result$V4>=2000 & result$V4<=3000,]
while(length(databatch<-read.table(con,header=FALSE,nrows=100000,sep="\t"))!=0) {
databatch<- databatch [databatch$V4>=2000 & databatch$V4<=3000,]
 result<-rbind(result,databatch)
}
close(con)
部分計算結果 

代碼解讀:

1行:打開文件句柄

2行:丟掉第一行,也就是列名。

3-4行:讀入第一批的十萬條數據,過濾后存入result。

5-8行:循環讀數。每批次讀入十萬行數據,過濾后的結果追加到result變量,然后再讀入下一批次。

9行:關閉文件句柄。

注意事項:

如果是小文件,則只需一句代碼就能完成讀數據的操作,第一行還可以設置為數據框的列名,但大文件不能這么實現,需要按批次讀取數據,第二批的數據就無法將第一行設為列名了,默認列名會是V1、V2、V3…….。

為了實現大文件按批次讀數據,必須使用while語句來實現算法,列名的使用也不夠方便,這就使整個代碼稍顯復雜。 

替代方案:

同樣的算法也可以用Python、集算器、Perl等語言來解決本案例。和R語言一樣,這幾種語言都可以實現文件數據的過濾以及結構化數據的計算,下面簡單介紹集算器和Python的解決方案。

集算器會自動分批處理數據,程序員無需用循環語句手工控制,因此代碼非常簡潔:

cursor是集算器中用于結構化數據計算的數據類型,和數據框的用法差不多,但對大文件和復雜計算更擅長。另外,cursor可以用@t選項將文件的第一行讀為列名。 

Python的代碼結構和R差不多,也是手工控制循環,但python本身缺乏數據框或cursor等結構化數據類型,因此代碼更底層些:

result = []
myfile = open("E: \\sales.txt",'r')
BUFSIZE = 10240000
myfile.readline()
lines = myfile.readlines(BUFSIZE)
value=0
while lines:
   for line in lines:
       record=line.split('\t')
       AMOUNT=float(record[3])
       if (AMOUNT>=2000 and AMOUNT<=3000):
result.append(record)
   lines = myfile.readlines(BUFSIZE)
myfile.close()

Python也可以用第三方包來實現上述算法,比如pandas就有類似數據框的結構化數據對象,但pandas對大文件的支持同樣有限,很難進一步簡化代碼。


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢