如果在特定工作表中存在字符串,则用TRUE为FALSE命名多行xlsx文件

时间:2018-10-18 15:51:46

标签: r grep xlsx pdf-scraping

此代码读取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

1 个答案:

答案 0 :(得分:1)

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

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)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时打印。