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

  

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

  1. R语言读取文件

    1.R语言读取文件,文件类型为.txt 直接使用read.table()即可,若不知道当前的工作目录,可以使用函数getwd()来查看 2.R语言读取文件,文件类型为.xlsx 方法一:可以把excl ...

  2. asp.net 遍历文件夹下全部子文件夹并绑定到gridview上

    遍历文件夹下所有子文件夹,并且遍历配置文件某一节点中所有key,value并且绑定到GridView上 Helper app_Helper = new Helper(); DataSet ds = n ...

  3. Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹

    Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹     1.将一个文件夹下的所有内容复制到另一个文件夹下 cp -r /home/packageA/* /home/cp/packageB ...

  4. 【集中工作薄】 当前文件夹中所有Excel文件中 多个工作簿的第一个工作表 复制到工作簿中

    功能:当前文件夹中所有Excel文件中 多个工作簿的第一个工作表 复制到工作簿中 Sub Books2Sheets() '定义对话框变量 Dim fd As FileDialog Set fd = A ...

  5. C#中获取Excel文件的第一个表名

    //    2.以数据库方式打开并输入数据//      此方式将xls文件所在目录看作数据库,其中的xls文件看作数据库表,表名即文件名(不加扩展名).//      函数importExcelTo ...

  6. 如何在单独的窗口中打开 Excel 文件

    如何在单独的窗口中打开 Excel 文件 文章编号:087583     2012/11/1 18:45:29 故障现象: 如何在单独的窗口中打开 Excel 文件? 解决方案: 比较安全的方法就是直 ...

  7. 使用Dir,遍历文件夹下所有子文件夹及文件

    '------------------------------------------- '获取某文件夹下所有文件和子目录下的文件 '--------------------------------- ...

  8. C#TreeView控件遍历文件夹下所有子文件夹以及文件

    一直对递归的理解不深刻,有时候觉得很简单,可是用起来总会出错.这里需要在TreeView控件里显示一个文件夹下的所有目录以及文件,毫无意外的需要用到递归. 一开始,想到用递归写一个生成每一个节点(Tr ...

  9. R语言读取excel文件的3种方法

    R读取excel文件中数据的方法: 电脑有一个excel文件,原始的文件路径是:E:\R workshop\mydata\biom excel数据为5乘2阶矩阵,元素为                ...

随机推荐

  1. 网易云易盾朱星星:最容易被驳回的10大APP过检项

    本文由  网易云发布. 1月20日,“走进网易:移动测试与安全实践”公开活动在杭州西湖区颐高创业大厦4F楼友会创业咖啡厅举行.本次活动的议题聚焦在如何实现应用的高效开发.安全过检.开发功耗降到最低等热 ...

  2. 简单的RNN和BP多层网络之间的区别

    先来个简单的多层网络 RNN的原理和出现的原因,解决什么场景的什么问题 关于RNN出现的原因,RNN详细的原理,已经有很多博文讲解的非常棒了. 如下: http://ai.51cto.com/art/ ...

  3. PAT甲题题解-1029. Median (25)-求两序列的中位数,题目更新了之后不水了

    这个是原先AC的代码,但是目前最后一个样例会超内存,也就是开不了两个数组来保存两个序列了,意味着我们只能开一个数组来存,这就需要利用到两个数组都有序的性质了. #include <iostrea ...

  4. 20135202闫佳歆--week4 系统调用(上)--学习笔记

    此为个人笔记存档 week 4 系统调用(上) 一.用户态.内核态和中断处理过程 用户通过库函数与系统调用联系起来. 1.内核态 在高执行级别下,代码可以执行特权指令,访问任意的物理地址. 2.用户态 ...

  5. Linux内核分析作业 NO.4

    扒开系统调用的三层皮(上) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  6. C语言版本:双链表的实现

    Dlist.h #ifndef __DLIST_H__ #define __DLIST_H__ #include<cstdio> #include<malloc.h> #inc ...

  7. Vivado绑定外部verilog编辑器

    前言 由于Vivado自带的verilog编辑器确实难用,写起来效率不高,因而寻找到了以下教程. 解决方案 引用sublime作为vivado外部verilog编辑器 sublime text中文编码 ...

  8. 使用redis防止抢购商品超卖

    前言: redis不仅仅是单纯的缓存,它还有一些特殊的功能,在一些特殊场景上很好用. 本篇博文用来测试下使用redis来防止抢购商品超卖问题. 内容: 使用redis的list进行测试 思路是设置一个 ...

  9. python + opencv 环境配置

    1.python 2.7.10 2.numpy 1.8.1 3.opencv2.4.8 4.OpenCV目录 ...\opencv\build\python\2.7" 下 "cv2 ...

  10. 顺序表的C、C++实现

    一个线性表表实现,函数声明放在 line_list.h 头文件汇总,函数定义放在line_list.c 中,main.c 用来测试各个函数. 1.文件 line_list.h // line_list ...