2012-03-03 4 views
14

Я ищу для загрузки gsipped csv и загружать его как объект R, не сохраняя его сначала на диск. Я могу сделать это с помощью zip-файлов, но не могу заставить его работать с gzfile или gzcon.Прочтите gzipped csv прямо с URL-адреса в R

Пример:

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

Это загружает (маленький) ГЗ сжатый файл, содержащий Wikipedia article feedback data (не имеет значения, а просто указать это не гигант или отвратительной).

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

ответ

16

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

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

Edit: Понял:

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 хочет идти туда и обратно в данных (для проверки ширины столбца, я полагаю).

+0

Да, я почти 70% уверен, что вы или JD ответили на что-то подобное. На самом деле я получил идею tempfile из предыдущего вашего ответа относительно zipped-папок. Но я не могу найти что-то w/gzfile/gzcon, которые, похоже, ведут себя иначе, чем некоторые другие функции, связанные с файлом или соединением. –

+0

Можете ли вы дистиллировать это? Я фактически использовал тот же трюк «потоковой передачи» из файла gzip еще в начале 1990-х годов, когда дисковое пространство было скуднее, и я сохранил результаты моделирования gzip'ed. Таким образом, способность прозрачно получить функциональность «gunzip» в F-библиотеке библиотеки C довольно старая школа и стандарт. –

+0

Я покажу это как ответ. Я мог бы вернуться и дать лучший ответ после некоторого обмана вокруг w/gzcon (что кажется более перспективным углом). –

Смежные вопросы