【问题标题】:R: read a csv file from multiple folders and write a xslx file keeping the sheet namesR:从多个文件夹中读取一个 csv 文件并写入一个 xlsx 文件,保留工作表名称
【发布时间】:2020-01-10 04:54:22
【问题描述】:

目录结构为:

data -> topic1 -> question1 -> sheetName.csv
               -> question2 -> sheetName.csv
               ...
     -> topic2 -> question1 -> sheetName.csv
               -> question2 -> sheetName.csv
     ...

我想要每个“主题”的 excel 文件的输出。在每个文件中,都有与该主题中的 sheetName.csv 相对应的工作表。例如。一个名为:topic1.xlsx 的 excel 文件,包含 3 张工作表,对应主题 1 中的 3 个 sheetName.csv 文件。

但我也想保留原始 .csv 文件中的工作表名称。请注意,“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 工作表,但工作表名称是“工作表 1、工作表 2 等......”。有没有办法在写入 excel 文件时保留工作表名称?

【问题讨论】:

    标签: r readxl


    【解决方案1】:

    好的,首先我将以编程方式生成 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 工作表名称写入 XLSX 工作簿名称,我创建了一个 for 循环,该循环使用两次调用 strsplit() 从文件名中获取工作表名称,然后调用 xlsx::write.xlsx() 来写入文件。我使用xlsx 包来编写 xlsx,因为它允许指定工作表名称并使用附加标志写入相同的 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_lst 有大约 50 个 csv 表,并且在原始文件中它们已经命名。有没有更简单的方法来写data_lst,同时保留原来的名字?
    • @dunguyen 看看更新的答案。将来,如果您按照我在回答的第一部分中所做的操作(即创建一个最小工作示例(MWE))——我为生成虚拟数据而编写的代码,您将节省很多时间来回答您的问题.
    • 对不起。我将为进一步的问题创建 MWE。谢谢!
    • @dunguyen 不用担心。我只是告诉你,这样你将来就有更好的机会得到一个好的答案! :)
    猜你喜欢
    • 2021-09-26
    • 2021-01-23
    • 2015-05-23
    • 2020-04-26
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多