Загрузка нескольких самых последних файлов в папку - PullRequest
0 голосов
/ 16 января 2019

Я знаю, как загрузить самый последний файл в папку, используя столбец mtime из функции file.info:

# Create the example data frame

Name <- c('AAA_2019_01_15.csv', 'AAA_2019_01_16.csv', 'AAA_2019_01_17.csv', 'BBB_2019_01_15.csv', 'BBB_2019_01_16.csv', 'BBB_2019_01_17.csv', 'CCC_2019_01_15.csv', 'CCC_2019_01_16.csv', 'CCC_2019_01_17.csv')
size <- as.numeric(1:9)
isdir <- rep(FALSE, 9)
mode <- rep(666, 9)
mtime <- as.POSIXct(c("2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28", "2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28", "2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28"))
ctime <- as.POSIXct(c("2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28", "2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28", "2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28"))
atime <- as.POSIXct(c("2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28", "2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28", "2019-01-15 18:07:28", "2019-01-16 18:07:28", "2019-01-17 18:07:28"))
exe <- rep("no", 9)
All_Files <- data.frame(size, isdir, mode, mtime, ctime, atime, exe)
All_Files$mode <- as.octmode(All_Files$mode)
rownames(All_Files) <- Name

# Upload the most recent file from the working directory

All_Files <- file.info(list.files(pattern = ".csv", full.names = TRUE), value = TRUE)
Most_Recent_File <- rownames(All_Files)[which.max(All_Files$mtime)]
Most_Recent_File <- read.table(Most_Recent_File, skip = 1, stringsAsFactors = F, sep = ",", na.strings = "NAN")

Я хочу загрузить самый последний файл, содержащий строку символов "AAA", самый последний файл, содержащий строку символов "BBB", и самый последний файл, содержащий строку символов "CCC", используя mtime столбец из функции file.info.

Есть ли способ сделать это без отдельного шага загрузки для каждой строки символов? Например, могу ли я создать символьный вектор c("AAA", "BBB", "CCC") и использовать его для загрузки самого последнего файла каждого типа? В реальной жизни у меня есть более 3 файлов для загрузки, поэтому эффективный способ сделать это был бы оценен. Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Я разобрался, как это сделать:

Сначала создайте вектор символов из символьных строк в именах файлов, для которых вы хотите получить самый последний файл:

Unique_Character_Strings_of_Files_to_Upload <- c("AAA", "BBB", "CCC")

Затем сгенерируйте фрейм данных информации о файле:

All_Files <- file.info(list.files(pattern = ".csv", full.names = TRUE), value = TRUE)

Затем создайте список, в котором первый компонент списка содержит все файлы, содержащие символьную строку «AAA», второй компонент содержит все файлы, содержащие «BBB», а третий компонент содержит все файлы, содержащие «CCC»:

List_of_Files <- lapply(Unique_Character_Strings_of_Files_to_Upload, function(x) {List_of_Files <- All_Files[grep(x, rownames(All_Files)), ]})
names(List_of_Files) <- Unique_Character_Strings_of_Files_to_Upload

Затем получите самый последний файл из каждого компонента списка:

Most_Recent_Station_Files <- lapply(List_of_Files, function(x) {return(x[which.max(x$mtime), ])})

Затем выберите только имена файлов из этого нового списка:

List_of_Names_of_Files_to_Upload <- lapply(Most_Recent_Station_Files, function (x) rownames(x))

Затем преобразуйте этот новый список в символьный вектор:

Names_of_Files_to_Upload <- unlist(List_of_Names_of_Files_to_Upload, use.names = FALSE)

Затем загрузите нужные файлы:

List_of_Files <- lapply(Names_of_Files_to_Upload, function(x) {read.table(x, skip = 1, stringsAsFactors = F, sep = ",", na.strings = "NAN")})
names(List_of_Files) <- Unique_Character_Strings_of_Files_to_Upload
0 голосов
/ 16 января 2019

Вероятно, есть более элегантный способ сделать что-то, но вот метод, использующий шаблоны tidyverse и regex.

library(tidyverse)

files <- c('AAA_2019_01_15', 'AAA_2019_01_16', 'AAA_2019_01_17', 
                 'BBB_2019_01_15', 'BBB_2019_01_16', 'BBB_2019_01_17', 
                 'CCC_2019_01_15', 'CCC_2019_01_16', 'CCC_2019_01_17')

dates <- str_extract_all(files, pattern = "[0-9]{4}_[0-9]{2}_[0-9]{2}", simplify = T) %>% 
  lubridate::ymd()

file_type <- str_extract_all(files, pattern = "AAA|BBB|CCC", simplify = T)


tibble(file_type, dates) %>% 
  mutate(file_names = files) %>% 
  group_by(file_type) %>% 
  arrange(desc(dates)) %>% 
  filter(row_number() == 1)
#> # A tibble: 3 x 3
#> # Groups:   file_type [3]
#>   file_type[,1] dates      file_names    
#>   <chr>         <date>     <chr>         
#> 1 AAA           2019-01-17 AAA_2019_01_17
#> 2 BBB           2019-01-17 BBB_2019_01_17
#> 3 CCC           2019-01-17 CCC_2019_01_17

Создано в 2019-01-15 пакетом Представлять (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...