Чтение gzipped csv прямо из URL в R - PullRequest
16 голосов
/ 03 марта 2012

Я хочу скачать сжатый csv и загрузить его как объект R, не сохраняя его сначала на диск.Я могу сделать это с заархивированными файлами, но не могу заставить его работать с gzfile или gzcon.

Пример:

grabRemote <- function(url) {
    temp <- tempfile()
    download.file(url, temp)
    aap.file <- read.csv(gzfile(temp), as.is = TRUE)
    unlink(temp)
    return(aap.file)
}
grabRemote("http://dumps.wikimedia.org/other/articlefeedback/aa_combined-20110321.csv.gz")

Загружает сжатый (небольшой) gz-файл, содержащий Данные обратной связи статьи из Википедии (не важно, но только для того, чтобы указать, что он не гигантский)или гнусно).

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

Ответы [ 2 ]

17 голосов
/ 03 марта 2012

Я почти уверен, что однажды ответил на этот вопрос.В результате Соединения API R (file(), url(), pipe(), ...) могут выполнять декомпрессию на лету, я не думаю, что вы можете сделать это для удаленных объектов http.

То же самое вы сделали из двух шагов: используйте download.file() с результатом tempfile() в качестве второго аргумента, чтобы получить сжатый файл, а затем прочитать из него.Как объект tempfile(), он будет очищен автоматически в конце сеанса R, поэтому я могу предложить одно небольшое исправление - пропустить unlink() (но тогда мне нравятся явные очистки, так что вы можете также оставить его).

Редактировать: Понял:

con <- gzcon(url(paste("http://dumps.wikimedia.org/other/articlefeedback/",
                       "aa_combined-20110321.csv.gz", sep="")))
txt <- readLines(con)
dat <- read.csv(textConnection(txt))

dim(dat)
# [1] 1490   19

summary(dat[,1:3])
# aa_page_id       page_namespace                 page_title  
# Min.   :     324   Min.   :0      United_States        :  79  
# 1st Qu.:   88568   1st Qu.:0      2011_NBA_Playoffs    :  52  
# Median : 2445733   Median :0      IPad_2               :  43  
# Mean   : 8279600   Mean   :0      IPod_Touch           :  38  
# 3rd Qu.:16179920   3rd Qu.:0      True_Grit_(2010_film):  38  
# Max.   :31230028   Max.   :0      IPhone_4             :  26  
# (Other)              :1214  

Ключ был подсказкой gzcon справки, которая может привести к распаковке вокруг существующего потока.Затем нам понадобится небольшой обход readLines и чтение с помощью textConnection из этого, поскольку read.csv хочет перемещаться в данных назад и вперед (я полагаю, для проверки ширины столбца).

1 голос
/ 23 марта 2019

Эта функция обобщает ответ Дирка:

R <- function(file_url) {
  con <- gzcon(url(file_url))
  txt <- readLines(con)
  return(read.csv(textConnection(txt)))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...