Читать конкретные листы из списка файлов Excel - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно прочитать определенные листы из списка файлов 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)

Кто-нибудь может мне помочь?

...