R:从多个文件夹中读取csv文件,然后编写一个xslx文件,保存工作表名称
目录的结构是:R:从多个文件夹中读取csv文件,然后编写一个xslx文件,保存工作表名称,r,readxl,R,Readxl,目录的结构是: data->topic1->question1->sheetName.csv ->问题2->sheetName.csv ... ->主题2->问题1->sheetName.csv ->问题2->sheetName.csv ... 我希望每个“主题”的输出都有一个excel文件。在每个文件中,都有与该主题中的sheetName.csv对应的图纸。例如,一个名为:topic1.xlsx的excel文件,包含3个工作表,与主题1中的3个sheetName.csv文件相对应 但我也希望
data->topic1->question1->sheetName.csv
->问题2->sheetName.csv
...
->主题2->问题1->sheetName.csv
->问题2->sheetName.csv
...
我希望每个“主题”的输出都有一个excel文件。在每个文件中,都有与该主题中的sheetName.csv对应的图纸。例如,一个名为:topic1.xlsx的excel文件,包含3个工作表,与主题1中的3个sheetName.csv文件相对应
但我也希望保留原始.csv文件中的工作表名称。请注意,“sheetName”是随机的(即不遵循任何模式)
以下是我迄今为止尝试过的代码:
库(readxl)
图书馆(writexl)
图书馆(dplyr)
路径名确定首先,我将以编程方式生成反映您描述的目录结构的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)
}
}
}
不工作。Mydata_lst
大约有50张csv表格,在原始文件中,它们已经命名。在保留原始名称的同时,有没有更简单的方法来写入数据?@dunguyen查看更新后的答案。将来,如果你像我在回答的第一部分中所做的那样,创建一个最小工作示例(MWE)——我编写的用于生成虚拟数据的代码,你将节省人们回答你问题的大量时间。我很抱歉。我将为进一步的问题创建MWE。谢谢@邓国恩不用担心。我只是告诉你,这样你将来有更好的机会得到一个好的答案!:)
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)
}
}