解決的問題:需要讀取某個大文件夾下所有子文件夾中的excel文件,並彙總,彙總文件中需要包含的2部分的信息:1.該條數據來源於哪個子文件夾;2.該條數據來源於哪個excel文件。最終,按照子文件夾單獨保存彙總文件,或者只保存成一個彙總文件。 場景描述:抓取了各個APP的使用數據,分散地保存在各個文件
解決的問題:需要讀取某個大文件夾下所有子文件夾中的excel文件,並彙總,彙總文件中需要包含的2部分的信息:1.該條數據來源於哪個子文件夾;2.該條數據來源於哪個excel文件。最終,按照子文件夾單獨保存彙總文件,或者只保存成一個彙總文件。
場景描述:抓取了各個APP的使用數據,分散地保存在各個文件夾中。文件格式如下:
- 第一級分類:文件夾名
-
第二級分類:文件夾下xlsx文件名
-
第三級分類:每個xlsx文件中每行(具體的每條數據),但其中並沒有該APP屬於的二級分類和一級分類,需要為每條數據添加二級分類和一級分類,並最終彙總到一個文件中。
解決方法一:
#作用:讀取每個文件夾下的excel,並將其合併成一個文件。 #共有3級:第一級:文件夾名,第二級:文件夾中的xlsx文件名,第三級:xlsx文件中的每行
#代碼後面註釋中若有:【修改】字樣,則表示如果要在你機器上運行該段代碼時,需要進行相應的修改。 ##########方法一:最終單獨保存在每個文件夾下 rm(list=ls()) setwd("E:/cnblogs") #設定工作目錄【修改】 library(xlsx) first_category_name = list.files("APP整理") #list.files命令得到"APP整理”文件夾下所有文件夾的名稱【修改】 dir = paste("./APP整理/",first_category_name,sep="") #用paste命令構建路徑變數dir,第一級目錄的詳細路徑【修改】 n = length(dir) #讀取dir長度,也就是:總共有多少個一級目錄 n_sub<-rep(0,n) n_sub<-as.data.frame(n_sub) n_sub<-t(n_sub) head(n_sub) #n_sub是每個一級目錄(文件夾)下有多少個文件,也就是:有多少個二級目錄,初始化為0,用於後面的操作 ########## for(i in 1:n){ #對於每個一級目錄(文件夾) b=list.files(dir[i]) #b是列出每個一級目錄(文件夾)中每個xlsx文件的名稱 n_sub[i]=length(b) #得到一級目錄(文件夾)下xlsx的文件個數:n_sub merge_1<-read.xlsx("E:/cnblogs/APP整理/xlsx文件樣例.xlsx",sheetIndex=1,encoding='UTF-8')# dim(merge_1) names(merge_1)<-c('序號','APP','2016-01-11','2016-01-12','2016-01-13','2016-01-14','2016-01-15','2016-01-16','2016-01-17')#我的文件列名,根據你具體情況修改【修改】 merge_1$second_category<-'second_category' merge_1$first_category<-'first_category' merge_1<-merge_1[1,-1] #這一段的目的是讀取一個xlsx文件樣例,得到一個初始的dataframe(不含數據),免除了後面重新建立datafram的麻煩,用於後面文件的rbind拼接 for(j in 1:n_sub[i]){ #對於每個一級目錄(文件夾)下的每個xlsx文件 new_1<-read.xlsx(file=paste(dir[i],'/',b[j],sep=''),sheetIndex=1,encoding='UTF-8') #讀取xlsx文件 names(new_1)<-c('序號','APP','2016-01-11','2016-01-12','2016-01-13','2016-01-14','2016-01-15','2016-01-16','2016-01-17')【修改】 new_1<-new_1[-1,-1] #因為實際數據需要,刪除第一行和第一列(根據實際讀取xlsx文件的情況進行修改) new_1$second_category<-substr(b[j],1,4) #二級目錄的名稱是xlsx的文件名。 new_1$first_category<-first_category_name[i] #一級目錄的名稱是“文件夾名” merge_1<-rbind(merge_1,new_1) } write.xlsx(merge_1,paste(dir[i],'/merge.xlsx',sep=''),row.names = F,col.names= F)#單獨保存在每個文件夾下 }
解決方法二:
##########方法二:最終得到一個彙總的xlsx文件,在每個文件夾下並沒有保存單獨的合併文件
rm(list=ls()) setwd("E:cnblogs") #設定工作目錄【修改】 library(xlsx) first_category_name = list.files("APP整理") #list.files命令得到"APP整理"文件夾下所有文件夾的名稱 dir = paste("./APP整理/",first_category_name,sep="") #用paste命令構建路徑變數dir,第一級目錄的詳細路徑 n = length(dir) #讀取dir長度,也就是:總共有多少個一級目錄 n_sub<-rep(0,n) n_sub<-as.data.frame(n_sub) n_sub<-t(n_sub) head(n_sub) #n_sub是每個一級目錄(文件夾)下有多少個文件,也就是:有多少個二級目錄,初始化為0,用於後面的操作 merge_1<-read.xlsx("E:/cnblogs/APP整理/xlsx文件樣例.xlsx",sheetIndex=1,encoding='UTF-8') dim(merge_1) names(merge_1)<-c('序號','APP','2016-01-11','2016-01-12','2016-01-13','2016-01-14','2016-01-15','2016-01-16','2016-01-17')#我的文件的列名【修改】 merge_1$second_category<-'second_category' merge_1$first_category<-'first_category' merge_1<-merge_1[1,-1] #這一段的目的是讀取一個xlsx文件樣例,得到一個初始的dataframe(不含數據),免除了後面重新建立一個dataframe的麻煩,用於後面文件的rbind拼接 for(i in 1:n){ #對於每個一級目錄(文件夾) b=list.files(dir[i]) #b是列出每個一級目錄(文件夾)中每個xlsx文件的名稱 n_sub[i]=length(b) #得到一級目錄(文件夾)下xlsx的文件個數:n_sub for(j in 1:n_sub[i]){ #對於每個一級目錄(文件夾)下的每個xlsx文件 new_1<-read.xlsx(file=paste(dir[i],'/',b[j],sep=''),sheetIndex=1,encoding='UTF-8') #讀取xlsx文件 names(new_1)<-c('序號','APP','2016-01-11','2016-01-12','2016-01-13','2016-01-14','2016-01-15','2016-01-16','2016-01-17')#我的文件的文件名【修改】 new_1<-new_1[-1,-1] #因為實際數據需要,刪除第一行和第一列(根據實際讀取xlsx文件的情況進行修改) new_1$second_category<-substr(b[j],1,4) #二級目錄的名稱是xlsx的文件名。 new_1$first_category<-first_category_name[i] #一級目錄的名稱是“文件夾名” merge_1<-rbind(merge_1,new_1) } # write.xlsx(merge_1,paste(dir[i],'/merge.xlsx',sep=''),row.names = F,col.names= F) } write.xlsx(merge_1,paste("./APP整理",'/merge.xlsx',sep='') ,row.names = F,col.names= F)#得到一個彙總文件,並沒有在每個文件夾下保存單獨的彙總文件