R:从多个文件夹中读取一个 csv 文件并写入一个保留 sheet 名称的 xlsx 文件
R: read a csv file from multiple folders and write a xslx file keeping the sheet names
目录结构为:
data -> topic1 -> question1 -> sheetName.csv
-> question2 -> sheetName.csv
...
-> topic2 -> question1 -> sheetName.csv
-> question2 -> sheetName.csv
...
输出 我想要每个 'topic' 的 excel 文件。在每个文件中,有 sheet 对应于该主题中的 sheetName.csv。例如。一个 excel 文件,名为:topic1.xlsx,有 3 个 sheet,对应主题 1 中的 3 个 sheetName.csv 文件。
但我还想保留原始 .csv 文件中的 sheet 名称。请注意 'sheetName' 是随机的(即不遵循任何模式)。
以下是我目前试过的代码:
library(readxl)
library(writexl)
library(dplyr)
pathName <- "/data/"
topicName <- list.files(path = pathName)
for(i in 1:length(topicName)) {
topicPath <- paste(pathName, topicName[[i]], sep = "")
files_to_read = list.files(
path = topicPath,
pattern = '*.csv',
recursive = TRUE,
full.names = TRUE
)
data_lst <- list()
data_lst <- lapply(files_to_read, read.csv)
setwd(pathName)
write_xlsx(data_lst, path = paste(topicName[[i]], ".", "xlsx", sep = ""))
}
我得到的输出是每个主题的 excel 文件和相应的 csv sheets,但 sheet 名称是 "sheet 1, sheet 2, etc..."。有没有办法在写入 excel 文件时保留 sheet 名称?
好的,首先我将以编程方式生成反映您描述的目录结构的 CSV 文件。 CSV 将被命名为随机数字串。
dir.create('data')
topics <- c("topic1", "topic2")
questions <- c("question1", "question2")
for(i in 1:length(topics)){
dir.create(paste0('data/', topics[i]), showWarnings = F)
for(j in 1:length(questions)){
dir.create(paste0('data/', topics[i], "/", questions[j]), showWarnings = F)
for(k in 1:3){
set.seed(Sys.time())
Sys.sleep(1)
sheet <- as.character(round(runif(1, 1, 99999999)))
print(sheet)
file.name = paste0('data/', topics[i], "/", questions[j], "/", sheet, ".csv")
write.csv(data.frame(x = 1), file = file.name)
}
}
}
接下来,回答你的问题,
为了将 CSV sheet 名称写入 XLSX 工作簿名称,我创建了一个 for 循环,使用两次调用 strsplit()
从文件名中获取 sheet 名称,然后调用 xlsx::write.xlsx()
写入文件。我使用 xlsx
包来编写 xlsx,因为它允许指定 sheet 名称并使用附加标志写入相同的 xlsx。
library(xlsx)
library(dplyr)
pathName <- "data/"
topicName <- list.files(path = pathName)
for(i in 1:length(topicName)) {
topicPath <- paste(pathName, topicName[[i]], sep = "")
files_to_read = list.files(
path = topicPath,
pattern = '*.csv',
recursive = TRUE,
full.names = TRUE
)
data_lst <- list()
for(k in 1:length(files_to_read)){
sheet_name <- strsplit(strsplit(files_to_read[k], "/")[[1]][4], "\.")[[1]][1]
file_name <- paste0("data/", topicName[[i]], ".xlsx")
dat <- read.csv(files_to_read[k])
write.xlsx(dat, file=file_name, sheetName=sheet_name, row.names=F, append=T)
}
}
目录结构为:
data -> topic1 -> question1 -> sheetName.csv
-> question2 -> sheetName.csv
...
-> topic2 -> question1 -> sheetName.csv
-> question2 -> sheetName.csv
...
输出 我想要每个 'topic' 的 excel 文件。在每个文件中,有 sheet 对应于该主题中的 sheetName.csv。例如。一个 excel 文件,名为:topic1.xlsx,有 3 个 sheet,对应主题 1 中的 3 个 sheetName.csv 文件。
但我还想保留原始 .csv 文件中的 sheet 名称。请注意 'sheetName' 是随机的(即不遵循任何模式)。
以下是我目前试过的代码:
library(readxl)
library(writexl)
library(dplyr)
pathName <- "/data/"
topicName <- list.files(path = pathName)
for(i in 1:length(topicName)) {
topicPath <- paste(pathName, topicName[[i]], sep = "")
files_to_read = list.files(
path = topicPath,
pattern = '*.csv',
recursive = TRUE,
full.names = TRUE
)
data_lst <- list()
data_lst <- lapply(files_to_read, read.csv)
setwd(pathName)
write_xlsx(data_lst, path = paste(topicName[[i]], ".", "xlsx", sep = ""))
}
我得到的输出是每个主题的 excel 文件和相应的 csv sheets,但 sheet 名称是 "sheet 1, sheet 2, etc..."。有没有办法在写入 excel 文件时保留 sheet 名称?
好的,首先我将以编程方式生成反映您描述的目录结构的 CSV 文件。 CSV 将被命名为随机数字串。
dir.create('data')
topics <- c("topic1", "topic2")
questions <- c("question1", "question2")
for(i in 1:length(topics)){
dir.create(paste0('data/', topics[i]), showWarnings = F)
for(j in 1:length(questions)){
dir.create(paste0('data/', topics[i], "/", questions[j]), showWarnings = F)
for(k in 1:3){
set.seed(Sys.time())
Sys.sleep(1)
sheet <- as.character(round(runif(1, 1, 99999999)))
print(sheet)
file.name = paste0('data/', topics[i], "/", questions[j], "/", sheet, ".csv")
write.csv(data.frame(x = 1), file = file.name)
}
}
}
接下来,回答你的问题,
为了将 CSV sheet 名称写入 XLSX 工作簿名称,我创建了一个 for 循环,使用两次调用 strsplit()
从文件名中获取 sheet 名称,然后调用 xlsx::write.xlsx()
写入文件。我使用 xlsx
包来编写 xlsx,因为它允许指定 sheet 名称并使用附加标志写入相同的 xlsx。
library(xlsx)
library(dplyr)
pathName <- "data/"
topicName <- list.files(path = pathName)
for(i in 1:length(topicName)) {
topicPath <- paste(pathName, topicName[[i]], sep = "")
files_to_read = list.files(
path = topicPath,
pattern = '*.csv',
recursive = TRUE,
full.names = TRUE
)
data_lst <- list()
for(k in 1:length(files_to_read)){
sheet_name <- strsplit(strsplit(files_to_read[k], "/")[[1]][4], "\.")[[1]][1]
file_name <- paste0("data/", topicName[[i]], ".xlsx")
dat <- read.csv(files_to_read[k])
write.xlsx(dat, file=file_name, sheetName=sheet_name, row.names=F, append=T)
}
}