【R语言】csv + excel批量文件的读取、导出处理

【R语言】csv + excel批量文件的读取、导出处理

      • 前言
      • 准备
      • 文件分类
        • 1. 文件读取
          • a.读取多个excel到一个excel 的一个sheet
          • b.读取一个excel的多个sheet到一个excel
          • c.csv 读取
        • 2.文件导出
          • a.写出到一个文件 csv/excel
          • b.写出到一个excel的多个sheet
          • c.一个excel按指定关键词写入多个sheet
      • 知识点

前言

经常遇到大数据量的导出,在hive和mysql中都是限制导出数据的,尝试过多个方法到本地后,总要合并文件,特别麻烦,所以写个脚本处理。

准备

准备对应的文件,方便实操。
【R语言】csv + excel批量文件的读取、导出处理_第1张图片

文件分类

1. 文件读取

a.读取多个excel到一个excel 的一个sheet

以excel为例: 
csv 用readr包,xlsx用readxl包
多个文件的导入,思路是循环遍历,解决文件的导入

方法1:
   library(purrr)
   library(readxl) 
   filenames1 <-list.files(path = "/Users/admin/Downloads/Excel测试文件", # 路径 
                           pattern = "*单sheet.xlsx",                    # 正则匹配 
                           full.names = T )        
   filenames1 
   df1 = purrr::map_dfr(set_names(filenames1),read_xlsx,.id = "来源")     # id 为来源字段名称 
   df1_2 = purrr::map_dfr(set_names(filenames1),~read_xlsx(.x,sheet = 1),.id = "来源")  # 读取指定sheet
    
方法2:
   library(tidyverse)
   library(openxlsx)

   filenames2 = dir("/Users/admin/Downloads/Excel测试文件",pattern = "*单sheet.xlsx")  # 获取文件目录 
   filenames2 
   df2 = map(list_name, ~ read.xlsx)
   df2  
   
b.读取一个excel的多个sheet到一个excel

多个sheet,可用readxl::excel_sheets 做遍历获取sheet名称;

    
    path = "/Users/admin/Downloads/Excel测试文件/测试1:多sheet.xlsx"
    df3 = map_dfr(set_names(excel_sheets(path)),               # excel_sheets()函数作用在该excel上,提取各sheet的名字,得到字符向量
                 ~read_xlsx(path,sheet = .x),.id = "sheet")
    df3 
    
c.csv 读取

csv读取和excel无大区别,但csv只有一个sheet,且读取要考虑编码问题;

   
    read_csv('/Users/admin/Downloads/Csv测试文件/测试2:单sheet.csv',  col_names = T)
    批量: (编译等问题会报错)
    library(purrr)
    library(readr) 
    filenames3 <-list.files(path = "/Users/admin/Downloads/Csv测试文件", # 路径 
                           pattern = "*单sheet.csv",                    # 正则匹配 
                           full.names = T )        
    filenames 
    df4 = purrr::map_dfr(set_names(filenames3),read_csv )  # id 为来源字段名称 
    

2.文件导出

a.写出到一个文件 csv/excel

这是最基础的,调包即可


	library(readr)
    write.csv(df1,'新文件.csv')
    library(writexl)
    write.xlsx(df1,'新文件.xlsx')
    
b.写出到一个excel的多个sheet

这个场景比较常见,可以了解,如果文件特别多的可以在批量导入后参考“c.一个excel按指定关键词写入多个sheet”的方法

    
    library(openxlsx)
    filenames4 = read_excel('/Users/admin/Downloads/Excel测试文件/测试2:单sheet.xlsx',col_names = T) 
    filenames5 = read_excel('/Users/admin/Downloads/Excel测试文件/测试3:单sheet.xlsx',col_names = T) 
    filenames6 = read_excel('/Users/admin/Downloads/Excel测试文件/测试4:单sheet.xlsx',col_names = T) 
    list_of_sheets <- list("sheet_a" = filenames4,
                           "sheet_b" = filenames5,
                           "sheet_c" = filenames6
                          ) 
    openxlsx::write.xlsx(list_of_sheets, "合并文件.xlsx",row.names=TRUE)
c.一个excel按指定关键词写入多个sheet

指定关键词,可以通用批量导入后分批导出实现的逻辑。


     方法1:
     library(tidyverse)
     library(writexl)
     df5 = df1 %>% 
           group_split(平台) %>%
           set_names(levels(df1$平台)) 
     write_xlsx(df5, "新文件.xlsx") 

     方法2:
     filename7 <- dir("/Users/admin/Downloads/Excel测试文件")            # 读取文件夹下所有文件名
     filePath <- sapply(filename7, function(x){ 
                       paste(path,x,sep='/')}
                       )                            # 合并文件路径和文件名
     df6 <- lapply(filePath, function(x){
                              import(x)} 
                   )                                # 读取所有excel文件
     write.xlsx(df6, "新文件.xlsx",quote=T,row.names = T,fileEncoding = 'utf-8')

知识点

整个文件处理基本的思路是循环遍历,循环遍历主要的几个方法:for循环 → apply函数 → map函数,或者用purrr::map_dfr实现快速的文件遍历+合并;
文件处理部分到此结束,希望能帮到大家。

希望本文有大家有帮助, 如有错误,欢迎指正。
原创不易,转载请注意出处。
本文地址:https://blog.csdn.net/weixin_41613094/article/details/128241334

你可能感兴趣的:(R语言学习,r语言,excel,开发语言)