R: проверьте существование «сегодняшнего» файла и, если он не существует, загрузите его

#r #data.table

#r #data.table

Вопрос:

Я пытаюсь проверить, есть ли у пользователя обновленная версия файла данных о распространенности Covid в Лондоне в их рабочем каталоге, и если нет, загрузите его отсюда:

 fileURL <-"https://api.coronavirus.data.gov.uk/v1/data?filters=areaType=region;areaName=Londonamp;structure={"areaType":"areaType","areaName":"areaName","areaCode":"areaCode","date":"date","newCasesBySpecimenDateRollingSum":"newCasesBySpecimenDateRollingSum","newCasesBySpecimenDateRollingRate":"newCasesBySpecimenDateRollingRate"}amp;format=csv"
  

Вставка этого URL-адреса в браузер загружает файл csv. использование download.file(URL, «data_.csv») создает мусор. Почему?

Пока у меня есть:

 library(data.table)

#Look for COVID file starting with "data_"
destfile <- list.files(pattern = "data_") 
#Find file date
fileDate<-file.info(destfile)$ctime %>%as.Date()

   if(!file.exists(destfile) | fileDate != today()){
     res <- tryCatch(download.file(url = fileURL,
                               destfile = paste0("data_",today(),".csv"),
                               method = "auto"),
                 error=function(e) 1)
     if(res!=1) COVIDdata<-data.table::fread(destfile) #This doesn't read the file
   }
  

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

 COVIDdata <- data.table::fread(fileURL)
  

Загружаемый ненужный файл — это:

введите описание изображения здесь

Комментарии:

1. Условие в вашем if предложении -очевидно, всегда дает TRUE результат — я думаю, причина в том, что fileDate это вектор дат, в котором у вас, кажется, всегда более старые даты. max(fileDate) != today() может сработать.

2. Спасибо за такой быстрый ответ. Я думаю, что самая большая проблема заключается в том, почему загрузка. функция file не сохраняет его в виде файла csv. Я приложил скриншот того, как он выглядит, когда я его открываю.

3. Похоже, на самом деле это не связано с data.table

4. @jangorecki это download.file проблема, возможно, заголовки ответов читаются неправильно….

Ответ №1:

Я думаю, что это проблема с кодированием результата download.file , одним из способов может быть использование fread для получения данных, а затем их запись с fwrite :

 #Look for COVID file starting with "data_"
destfile <- list.files(pattern = "data_") 
#Find file date
fileDate <- file.info(destfile)$ctime %>% as.Date()
#>[1] "2020-11-06" "2020-11-06" "2020-11-06"

if(!length(destfile) | max(fileDate) != today()){
  COVIDdata <- fread(fileURL)
  fwrite(COVIDdata, file = paste0("data_",today(),".csv"))
}