经常遇到大数据量的导出,在hive和mysql中都是限制导出数据的,尝试过多个方法到本地后,总要合并文件,特别麻烦,所以写个脚本处理。
以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
多个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
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 为来源字段名称
这是最基础的,调包即可
library(readr)
write.csv(df1,'新文件.csv')
library(writexl)
write.xlsx(df1,'新文件.xlsx')
这个场景比较常见,可以了解,如果文件特别多的可以在批量导入后参考“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)
指定关键词,可以通用批量导入后分批导出实现的逻辑。
方法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