[R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[R语⾔]读取⽂件夹下所有⼦⽂件夹中的excel⽂件,并根据分类合
并。
解决的问题:需要读取某个⼤⽂件夹下所有⼦⽂件夹中的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=''),s = F,s= 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=''),s = F,s= F)
}
write.xlsx(merge_1,paste("./APP整理",'/merge.xlsx',sep='')
,s = F,s= F)#得到⼀个汇总⽂件,并没有在每个⽂件夹下保存单独的汇总⽂件。