R for-loop для переменных в адресе ftp - PullRequest
0 голосов
/ 11 октября 2018

Я хочу получить несколько zip-файлов с ftp-сервера.Я могу получить zip-файлы индивидуально с помощью предыдущих сообщений.

Но это было бы много работы для всех необходимых данных.Поэтому я хочу найти автоматизированный способ.

FTP выглядит следующим образом: ftp: //ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/10_minutes/solar/now/10minutenwerte_SOLAR_01048_now.zip

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

Я думал, что ямогу просто зациклить все необходимые станции

for(y in Data$StationsID)) {
  urls <- "ftp://ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/10_minutes/solar/now/10minutenwerte_SOLAR_{y}_now.zip"))
}

но я получаю только " ftp: //ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/10_minutes/solar/now/10minutenwerte_SOLAR_abilitiesy‹_now.zip"))

данные zip содержат идеальный файл .txt для анализа csv.

Позже я хочу использовать файлы для получения данных о солнечной энергии.разные точки в германии.Но сначала мне нужен такой список, но я не знаю, как его получить:

urls
[1] url_1
[2] url_2
.
.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

(?? первый вопрос!)

Ниже представлен альтернативный подход.

Мы:

  • получаем все возможные файлы данных
  • Отфильтруйте его только по файлам данных SOLAR zip (вы можете отфильтровать больше, если это необходимо - т.е. ограничить его тем, что имеется в вашем существующем фрейме данных)
  • создать папку для сохранения
  • загрузить файлы

Обратите внимание, что это действительно плохая форма - забивать сервер последовательными запросами без паузы, так что это вводит это, но это часто игнорируется вежливостью в наши дни.

library(curl)
library(httr)

base_dir <- "ftp://ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/10_minutes/solar/now/"

# Get all available files in that directory
res <- curl_fetch_memory(base_dir, handle = new_handle(dirlistonly = TRUE)

grep(
  "SOLAR_[[:digit:]]{5}",
  strsplit(rawToChar(res$content), "\n")[[1]], # curl_fetch returns a raw vector since it has no idea what type of content might be there so we have to convert it and it's a text listing so we have to do some more wrangling
  value = TRUE
) -> all_zips

head(all_zips)
## [1] "10minutenwerte_SOLAR_00044_now.zip"
## [2] "10minutenwerte_SOLAR_00071_now.zip"
## [3] "10minutenwerte_SOLAR_00073_now.zip"
## [4] "10minutenwerte_SOLAR_00131_now.zip"
## [5] "10minutenwerte_SOLAR_00150_now.zip"
## [6] "10minutenwerte_SOLAR_00154_now.zip"

save_dir <- "~/Data/solar-output"

dir.create(save_dir)

for (zip in all_zips) {
  try(httr::GET(
    url = sprintf("%s%s", base_dir, zip),
    httr::write_disk(file.path(save_dir, zip)), # enables caching (it won't overwrite by default and avoid issues with download.file() on windows)
    httr::progress() # progress bars for free!
  ))
  Sys.sleep(5) # be kind to their server CPU and network bandwidth
}

Мы завернемGET() в try(), поскольку мы попросили write_disk() до не перезаписать существующие файлы.Когда это происходит, возникает исключение, поэтому try() перехватывает его и позволяет циклу продолжать работу (но все равно отображает полезное сообщение о файле, который уже существует).

0 голосов
/ 11 октября 2018

Вам даже не нужна петля.Попробуйте

urls <- paste0("ftp://ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/10_minutes/solar/now/10minutenwerte_SOLAR_", Data$StationsID, "_now.zip")

Это даст вам вектор всех URL.После этого вы можете получить все файлы, используя, например, lapply.

results <- lapply(urls, FUN = function(u) {
  # FETCH
  # UNZIP
  # TIDY
  # ...
}
...