我有一个非常大的DAT文件(16 GB)。它包含一些信息,比如1000个客户。此数据的排序如下,第一列代表客户ID:
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 :(得分:0)
最佳解决方案可能是将数据导入适当的数据库,但如果您真的想根据第一个令牌将文件拆分为多个文件,那么您可以使用awk
这个单行。< / p>
awk '/^/ {ofn=$1 ".txt"} ofn {print > ofn}' filetosplit.txt
它的工作原理是
/^/
匹配行的开头{ofn=$1 ".txt"}
将ofn
变量设置为第一个单词(由空格分隔)并附加.txt
。 ofn
设置的文件。我的笔记本电脑上花了不到两分钟的时间将1 GB文件与上面列出的格式分成多个文本文件。我不知道它的尺度有多好,或者它对你来说足够快。如果你想要一个R解决方案,你总是可以把它包装成system()
电话; o)
<强>附录:强>
哦......我猜你是基于你提到的路径在窗户上。然后,您可能需要安装Cygwin才能获得awk
。