使用r語言過濾檔案資料是很普遍的操作,但有時我們會遇到比較大的檔案,這類檔案無法全部讀入記憶體處理,需要採用分批讀取、分批過濾、拼合結果的辦法來解決。下面用乙個例子來說明r實現大檔案資料過濾的方法。
有個1g的檔案sales.txt,儲存著大量訂單記錄,請過濾出amount字段值在2000和3000之間的記錄。該檔案的列分割符為「\t」,前幾行資料如下:
r語言解決方案
con
readlines(con,n=1)
result=read.table(con,nrows=100000,sep="\t")
result=2000 & result$v4<=3000,]
while(length(databatch
close(con)
部分計算結果
**解讀:
1行:開啟檔案控制代碼
2行:丟掉第一行,也就是列名。
3-4行:讀入第一批的十萬條資料,過濾後存入result。
9行:關閉檔案控制代碼。
注意事項:
如果是小檔案,則只需一句**就能完成讀資料的操作,第一行還可以設定為資料框的列名,但大檔案不能這麼實現,需要按批次讀取資料,第二批的資料就無法將第一行設為列名了,預設列名會是v1、v2、v3…….。
為了實現大檔案按批次讀資料,必須使用while語句來實現演算法,列名的使用也不夠方便,這就使整個**稍顯複雜。
替代方案:
同樣的演算法也可以用python、集算器、perl等語言來解決本案例。和r語言一樣,這幾種語言都可以實現檔案資料的過濾以及結構化資料的計算,下面簡單介紹集算器和python的解決方案。
集算器會自動分批處理資料,程式設計師無需用迴圈語句手工控制,因此**非常簡潔:
cursor是集算器中用於結構化資料計算的資料型別,和資料框的用法差不多,但對大檔案和複雜計算更擅長。另外,cursor可以用@t選項將檔案的第一行讀為列名。
python的**結構和r差不多,也是手工控制迴圈,但python本身缺乏資料框或cursor等結構化資料型別,因此**更底層些:
python也可以用第三方包來實現上述演算法,比如pandas就有類似資料框的結構化資料物件,但pandas對大檔案的支援同樣有限,很難進一步簡化**。
kettle實現文字檔案資料抽取方法
kettle 思路是,把乙個有特定格式的的文字檔案,寫入oracle 資料庫表,具體方法見如下操作 1 test1 2 test2 3 test3 通過 進行分割的。具體操作方法 開啟kettle 新建立乙個轉換,拖出來如下控制項 下面我們來看每個空間具體的配置 這裡我們需要配置的有以下幾個地方,具...
kettle實現文字檔案資料抽取方法
kettle做排程的思路是,把乙個有特定格式的的文字檔案,寫入oracle資料庫表,具體方法見如下操作 1 test1 2 test2 3 test3 通過 進行分割的。具體操作方法 開啟kettle,新建立乙個轉換,拖出來如下控制項 下面我們來看每個空間具體的配置 這裡我們需要配置的有以下幾個地方...
讀取文字檔案資料
讀取文字檔案資料 檔案路徑 private datatable gettxt string path dt.columns.add line.substring 0,index line line.substring index,line.length index trim datarow dr d...