Мне нужно прочитать определенные листы из списка файлов Excel.У меня> 500 файлов Excel, ".xls"
и ".xlsx"
.Каждый файл может иметь разные листы, но я просто хочу прочитать каждый лист, содержащий конкретное выражение, например pattern = "^Abc"
, и не во всех файлах есть листы с этим шаблоном.Я создал код для чтения одного файла, но когда я пытаюсь перевести на несколько файлов, всегда возвращает ошибку.
# example with 3rd file
# 2 sheets have the pattern
list_excels <- list.files(path = "path_to_folder", pattern = ".xls*"
sheet_names <- excel_sheets(list_excels[[3]])
list_sheets <- lapply(excel_sheets(list_excels[[3]]), read_excel, path = list_excels[[3]])
names(list_sheets) <- sheet_names
do.call("rbind", list_sheets[grepl(pattern = "^Abc", sheet names)])
Но когда я пытаюсь кодировать для чтения нескольких файлов, у меня естьошибка или что-то в цикле, что сильно замедляет вычисления.
Есть несколько примеров
Это цикл, который не возвращает ошибку, но занимает по крайней мере 30 секунд для каждого элементаиз списка, я никогда не ждал до конца.
for (i in seq_along(list_excels)) {
sheet_names <- excel_sheets(list_excels[[i]])
list_sheets <- lapply(excel_sheets(list_excels[[i]]), read_excel, path = list_excels[[i]])
names(list_sheets) <- sheet_names[i] list_sheets[grepl(pattern = "^Abc", sheet_names)]
}
В этом цикле отсутствует заключительная часть, листы объединения с этим кодом
list_sheets[grepl(pattern = "^Abc", sheet_names)]
Я попытался суммировать строки каждого листа и сохранить его в векторе, но я думаю, что цикл прерывается, когда есть лист, который не имеет шаблона.
x <- c()
for(i in seq_along(list_excels)) {
x[i] <- nrow(do.call("rbind",
lapply(excel_sheets(list_excels[[i]]),
read_excel,
path = list_excels[[i]])[grepl(pattern = "^Abc",
excel_sheets(list_excels[[i]]))]))
Также с библиотекой purrr
, пытающейся прочитать все, тот же результат, что и в первом примере цикла.
list_test <- list()
for(i in seq_along(list_excels)) {
list_test[[i]] <- excel_sheets(list_excels[[i]]) %>%
set_names() %>%
map(read_excel, path = list_excels[[i]])
}
Последний пример, который работает с одним файлом Excel, но не с несколькими.Просто читаю именной лист.
# One file works
data.frame(readWorksheetFromFile(list_excels[[1]], sheet = "Abc"))
#Multiple file returns an error
for(i in seq_along(list_excels)) {
data.frame(readWorksheetFromFile(list_excels[[i]], sheet = "Abc"))
#Returns the following error
#Error: IllegalArgumentException (Java): Sheet index (-1) is out of range (0..1)
Кто-нибудь может мне помочь?