2017-07-25 68 views
1

我有一個非常大的DAT文件(16 GB)。它包含一些我們所說的1000個客戶的信息。該數據按如下排序,第一列代表客戶ID:從一個非常大的文件中提取和存儲數據R

9909814 246766 0 31/07/2012 7:00 0.03 0 0 0 0 
8211675 262537 0 8/04/2013 3:00 0.52 0 0 0 0 

但是,客戶的數據不是以有組織的方式存儲的。所以,我想提取每個客戶的數據並將其存儲在單獨的文件中。 (我有一個包含客戶ID的文件。)

對於只有一個客戶,我編寫了以下代碼,可以搜索文件並提取數據。不過,我的問題是如何,當我讀這個大文件到R.

con<-file('D:/CD_INTERVAL_READING.DAT') 
open(con) 
n=20 
nk=100000 
B=9909814 #customer ID for customer no.1 
customer1 <- read.table(con, sep=",", nrow=1) 
for (i in 1:n) { 
    conn <- read.table(con,sep=",",skip=(i-1)*nk, nrow=nk) 
## extracts just those rows that belong to a specific customer ID 
    temp1 <-conn[conn$V1==B,] 
customer1 <-rbind(customer1,temp1) 
} 
customer1 <- customer1 [-1,] 

library(xlsx) 
write.xlsx(customer1, "D:/customer1.xlsx") 
+0

你是否在有限內存的計算機上執行此操作?另外,你有沒有考慮過一次讀取文件塊?你可以閱讀更多關於[這裏](https://rstudio-pubs-static.s3.amazonaws.com/72295_692737b667614d369bd87cb0f51c9a4b.html) – Megatron

+0

謝謝,我可以使用uni工具進行快速處理。實際上,也許,我的主要問題有點簡單。我的意思是我不知道如何爲每個客戶定義一個文件。我需要例如定義名爲customer1,customer2等的文件並將數據寫入它們。 – Rlearner

+0

每一行都是客戶?對於每個客戶,你想寫一個新的文件? –

回答

0

做到這一點對所有的客戶的最佳解決方案可能是將數據導入到正確的數據庫,但如果你真的想要根據第一個令牌將文件拆分爲多個文件,那麼您可以使用awk這一行。

awk '/^/ {ofn=$1 ".txt"} ofn {print > ofn}' filetosplit.txt 

它通過線的

  • /^/匹配開始
  • {ofn=$1 ".txt"}ofn變量與.txt所附設置到第一字(由白色空間分割)。
  • 將每行打印到由ofn設置的文件。

在我的筆記本電腦上用兩分鐘時間將上面列出的相同格式的1 GB文件分成多個文本文件。我不知道這個尺度有多好,或者它對你來說足夠快。如果你想的R解決方案,您可以隨時把它包裝成一個system()呼叫; O)

附錄: 呵呵......我猜你是基於你提到的路徑上的窗口。那麼你可能需要安裝Cygwin得到awk

+0

感謝您的回覆,爲像我這樣的初學者提供了不錯的信息。當然,以後可以用它來模擬我的模擬。 – Rlearner

相關問題