• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

解决的问题:需要读取某个大文件夹下所有子文件夹中的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)#得到一个汇总文件,并没有在每个文件夹下保存单独的汇总文件

  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
R语言kohonen包主要函数介绍发布时间:2022-07-18
下一篇:
R语言:导入导出数据发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap