Как прочитать CSV-файл или загрузить книгу Excel, игнорируя некоторые символы в пути к файлу?

Я пишу сценарий цикла, который включает чтение файла из книги (с использованием пакета XLConnect). Проблема в том, что имена файлов содержат символы (представляющие время), которые я хочу игнорировать.

Например, вот 3 пути к этим файлам:

G://User//Documents//daily_data//Op_Schedule_20160520_132025.xlsx G://User//Documents//daily_data//Op_Schedule_20160521_142805.xlsx G://User//Documents//daily_data//Op_Schedule_20160522_103052.xlsx

Мне нужно импортировать сотни этих файлов. Я могу легко объяснить строку символов, представляющую дату (например, 20160522), но не время.

Есть ли способ сказать R игнорировать некоторые символы, расположенные в пути к файлу? Вот как я думал о написании своего сценария («???» — это то, где мне нужна помощь). Я знаю, что цикл, вероятно, не самый эффективный способ, но я открыт для предложений, если они у вас есть:

require(XLConnect)
path= "G://User//Documents//daily_data//Op_Schedule_"

wd.seq = format(seq(as.Date("2014-01-01"),as.Date("2016-12-31"),"days"),format="%Y%m%d")

scheduleList = rep(list(matrix(1,1,1)),length(wd.seq))

for(i in 1:length(wd.seq)) { 
wb = loadWorkbook(file= paste0(path,wd.seq[i],"???",".xlxs"))
scheduleList[[i]] = readWorksheet(wb,sheet='=SCHEDULE', header = TRUE)
}

`

Спасибо за прочтение и предложения, если таковые имеются.

Матье


person Mathieu    schedule 30.05.2016    source источник


Ответы (1)


Я не знаю, полезно ли это, но если вы хотите прочитать все файлы в определенном каталоге (что, как мне кажется, вам нужно), вы можете прочитать все имена файлов в список, используя список. функция files(), например

fileList <- list.files(""G://User//Documents//daily_data//")

А затем загрузите файлы xlsx, перебирая список с помощью цикла for

for(i in fileList) {
    loadWorkbook(file = i)
    }

Я не использовал функцию XLConnect раньше, так что точный код, вероятно, не работает, но цикл будет перебирать все файлы в этом каталоге, и поэтому вы можете построить свой вызов загрузки, используя переменную i для имени файла (он не будет работать). это не абсолютный путь, поэтому вам может понадобиться использовать вставку, чтобы добавить первую часть пути к файлу)

Я понимаю, что в каталоге могут быть другие файлы, которые не являются файлами Excel, вы можете использовать grepl для выбора только файлов, содержащих «OP_Schedule_»

fileListClean <- fileList[grepl("Op_Schedule_",fileList)]

или, возможно, только выбор файлов .xlsx в каталоге:

fileListClean <- fileList[grepl(".xlsx",fileList)]

Редактировать, чтобы соответствовать вашему ответу. Так как вам нужно подогнать его под последовательность, вы можете сделать это так же, как и раньше:

wd.seq = format(seq(as.Date("2014-01-01"),as.Date("2016-12-31"),"days"),format="%Y%m%d")
wd.seq2 <- paste("Op_Schedule_", wd.seq, sep = "")

А затем используйте grepl, чтобы выбрать только файлы, начинающиеся с этого расширения:

fileListClean <- fileList[grepl(paste(wd.seq2, collapse = "|"), fileList)]

Полное раскрытие: последняя часть, которую я получил из этого ответа SO: grep с использованием вектор символов с несколькими шаблонами

person Kári Gunnarsson    schedule 30.05.2016
comment
Takk fyrir Kari, было бы неплохо, если бы мне понадобились все файлы в каталоге... К сожалению, скрипт запускается каждый день, и необходимый период времени (например, 100 дней) меняется во времени, поэтому я не хочу тянуть все файлы. - person Mathieu; 31.05.2016
comment
Эй, Матье, возможно, это не самое элегантное решение, но вы можете проверить отредактированный ответ, должен делать то, что вы хотели. - person Kári Gunnarsson; 01.06.2016
comment
Извините за задержку ответа Кари. Это прекрасно работает! Мне нравится эта функция grepl; Я не знал об этом. Для других пользователей, которые могут найти этот пост полезным: вы должны добавить начало пути перед списком файлов: - person Mathieu; 08.06.2016
comment
fileList = paste0(G://Пользователь//Документы//ежедневные_данные//, list.files(G://Пользователь//Документы//ежедневные_данные//)) - person Mathieu; 08.06.2016