download.file () скачать поврежденный xls - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь создать пакет для загрузки, импорта и очистки данных с веб-страницы Центрального банка Доминиканской Республики c. Я сделал все кодирование в Rstudio.cloud, и все работает просто отлично, но когда я пробую функции на моем локальном компьютере, они не работают.

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

Я включил первые шаги функции, чтобы проиллюстрировать мою проблему.

url файла

# Packages
library(readxl)

# file url. 
url <- paste0("https://cdn.bancentral.gov.do/documents/",
              "estadisticas/precios/documents/",
              "ipc_base_2010.xls?v=1570116997757")

# termporary path
file_path <- tempfile(pattern = "", fileext = ".xls")

# downloading 
download.file(url, file_path, quiet = TRUE)

# reading the file
ipc_general <- readxl::read_excel(
            file_path,
            sheet = 1,
            col_names = FALSE,
            skip = 7
        )

Error: 
  filepath: C:\Users\Johan Rosa\AppData\Local\Temp\RtmpQ1rOT3\2a74778a1a64.xls
  libxls error: Unable to open file

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

Я хочу знать:

  1. Почему этот код работает в rstudio.clowd, а не локально?
  2. Что я могу сделать, чтобы выполнить работу? (альтернативный подход, пакеты, функции)

Кстати, я использую Windows 10

Редактировать

Ответ:

1 - Rstudio.cloud работает на linux, но для Windows мне нужно внести некоторые изменения в команду download.file().

2- download.file(url, file_path, quiet = TRUE, mode = "wb")

Это то, что я искал.

Теперь у меня другая проблема. Я должен придумать способ определить, работает ли функция на Linux или Windows, чтобы установить этот аргумент соответствующим образом.

Я могу написать новую функцию файла загрузки, используя вызовы if else on .Platform $ OS.type result.

Или я могу установить mode = "wb" для всех вызовов download.file ()?

У вас есть какие-либо рекомендации?

1 Ответ

2 голосов
/ 11 апреля 2020

Из документации download.file()

Выбор двоичной передачи (mode = "wb" или "ab") важен для Windows, поскольку в отличие от Unix -подобна различает guish между текстовыми и двоичными файлами и для передачи текста изменяет \ n окончания строк на \ r \ n (он же CRLF).

Код, написанный для загрузки двоичных файлов, должен использовать mode = "wb "(или" ab "), но проблемы, возникающие при передаче текста, будут видны только на Windows.

Из источника download.file

head(print(download.file),12)
1  function (url, destfile, method, quiet = FALSE, mode = "w", cacheOK = TRUE,    
2      extra = getOption("download.file.extra"), headers = NULL,                  
3      ...)                                                                       
4  {                                                                              
5      destfile                                                                   
6      method <- if (missing(method))                                             
7          getOption("download.file.method", default = "auto")                    
8      else match.arg(method, c("auto", "internal", "wininet", "libcurl",         
9          "wget", "curl", "lynx"))                                               
10     if (missing(mode) && length(grep("\\\\.(gz|bz2|xz|tgz|zip|rd[as]|RData)$", 
11         URLdecode(url))))                                                      
12         mode <- "wb" 

Итак, глядя на источник, если вы не установили режим, функция автоматически использует «w», за исключением того, что URL содержит gz, bz2, xz et c. (именно поэтому вы получаете первую ошибку).

По моему скромному мнению, я думаю, что в Unix -подобных (например, Linux) "w" и "wb" одинаковы, потому что они делают не различать текстовые и двоичные файлы, но Windows делает.

Таким образом, вы можете установить mode = "wd" для всех вызовов download.file (если это не передача текста в Windows), это не повлияет на функцию в Linux.

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