从R中的非常大的文件中提取和存储数据

时间:2017-07-25 01:51:05

标签: r

我有一个非常大的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")

1 个答案:

答案 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