【R语言】csv + excel批量文件的读取、导出处理
一、前言
经常遇到大数据量的导出,在hive和mysql中都是限制导出数据的,尝试过多个方法到本地后,总要合并文件,特别麻烦,所以写个脚本处理。
二、准备
准备对应的文件,方便实操。
三、文件分类
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名称;
# 设置本地路径
setwd('/Users/admin/Downloads')
# 加载所需的包
library('readxl')
library("writexl")
# 定义要读取的文件夹路径
folder_path <- "/Users/admin/Downloads/Excel测试文件"
# 获取文件夹中的所有文件
file_list <- list.files(folder_path, full.names = TRUE)
# 初始化一个空的数据框用于存储合并后的数据
merged_data <- data.frame()
# 循环读取并合并文件
for (file in file_list) {
# 读取excel文件
data <- read_excel(file)
# 合并数据
merged_data <- rbind(merged_data, data)
}
# 将合并后的数据写入新的excel文件
write_xlsx(merged_data, "合并文件导出.xlsx")
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.youkuaiyun.com/weixin_41613094/article/details/128241334