首页 > 解决方案 > 如果特定工作表中存在字符串,则使用 TRUE 为 FALSE 命名多个 xlsx 文件

问题描述

此代码读取 xlsx 文件并根据工作表编号和在特定位置(在本例中为 temp[2,1])找到的值创建单独命名的文件。但是,由于每个文件和工作表都略有不同,因此名称不一致。

sheet_to_read <- c(11,12,13,14)
for( excelsheet in files) {
for (sheet in sheet_to_read) {
temp <- read_excel( path = excelsheet, sheet = sheet, col_names = FALSE)
write.csv( temp, file = paste0( "./", gsub("./", "", excelsheet), temp[2,1], sheet,".csv") )
}}

如果在工作表中的任何位置(在本例中为“vivax”)存在特定字符串,我想要一种用 TRUE 或 FALSE 命名文件的方法。所以在这种情况下:

GBD2016_2_915_Boletin Epidemiologico_2016_37sheet21true.xls
GBD2016_2_915_Boletin Epidemiologico_2016_37sheet22false.xls`

示例文件:https ://drive.google.com/file/d/1p4HAuFl7Codine1Vvb8SzA7OHTzraaHz/view?usp=sharing

标签: rxlsxpdf-scraping

解决方案


由于您有一个小标题,并且不知道哪个列具有哪种类型,所以我创建了这个:

isWordInTibble <- function(word, tibble) {
  # case insensitive
  any(unlist(
    sapply(1:ncol(tibble), 
           function(i) tolower(word) %in% tolower(as.character(unlist(tibble[, i]))))))
}

它查看单词是否在任何列向量中 - 查看所有列。

write.csv命令中的文件参数替换为:

file = gsub(".xls", 
            paste0(substr(temp[2, 1], 
                          1, 
                          5), # just first 5 letters
                   gsub("sheet", "", sheet), 
                   substr(tolower(as.character(isWordInTibble("vivax", tmp))),
                          1, 
                          1), # just first letter ("t" or "f") 
                   ".csv"), 
            excelsheet)

那么它可能会起作用!

我尝试使用substr(, start, end)and来缩短名称gsub()

附录

既然你问如何打印,那么只有包含这个词的文件而不是那些不包含它的文件:

在您的示例中,而不是write.csv()命令,将其替换为:

if (isWordInTibble("vivax", tmP)) {
  write.csv(temp, 
            file = gsub(".xls", 
                        paste0(substr(temp[2, 1], 
                                      1, 
                                      5), # just first 5 letters
                               gsub("sheet", "", sheet), 
                               substr(tolower(as.character(isWordInTibble("vivax", temp))),
                                      1, 
                                      1), # just first letter ("t" or "f") 
                               ".csv"), 
                        excelsheet))
}

然后它仅在isWordInTibble返回时打印出来TRUE


推荐阅读