Использование R для загрузки сжатого файла данных, извлечения и импорта данных - PullRequest
113 голосов
/ 16 июня 2010

@ EZGraphs в Твиттере пишет: «Многие онлайновые csvs заархивированы. Есть ли способ загрузить, распаковать архив и загрузить данные в data.frame с помощью R? #Rstats»

IЯ также пытался сделать это сегодня, но в итоге просто загрузил zip-файл вручную.

Я попробовал что-то вроде:

fileName <- "http://www.newcl.org/data/zipfiles/a1.zip"
con1 <- unz(fileName, filename="a1.dat", open = "r")

, но мне кажется, что я далеко,Есть мысли?

Ответы [ 7 ]

160 голосов
/ 16 июня 2010

Zip-архивы на самом деле являются «файловой системой» с метаданными контента и т. Д. Подробнее см. help(unzip). Таким образом, чтобы сделать то, что вы набросали выше, вам нужно

  1. Создать темп. имя файла (например, tempfile())
  2. Используйте download.file() для извлечения файла в темп. файл
  3. Используйте unz(), чтобы извлечь целевой файл из темп. файл
  4. Удалить временный файл через unlink()

который в коде (спасибо за базовый пример, но это проще) выглядит как

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
data <- read.table(unz(temp, "a1.dat"))
unlink(temp)

Сжатые (.z) или сжатые (.gz) или bzip2ed (.bz2) файлы представляют собой только файл и те, которые вы можете прочитать непосредственно из соединения. Поэтому попросите провайдера данных использовать его вместо этого:)

27 голосов
/ 16 июня 2010

Просто для протокола, я попытался перевести ответ Дирка в код: -P

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
con <- unz(temp, "a1.dat")
data <- matrix(scan(con),ncol=4,byrow=TRUE)
unlink(temp)
17 голосов
/ 09 декабря 2014

Я использовал CRAN-пакет "Загрузчик", найденный по адресу http://cran.r -project.org / web / packages / downloader / index.html . Гораздо проще.

download(url, dest="dataset.zip", mode="wb") 
unzip ("dataset.zip", exdir = "./")
6 голосов
/ 15 июня 2016

Для Mac (и я предполагаю, что Linux) ...

Если zip-архив содержит один файл, вы можете использовать команду bash funzip в сочетании с fread из data.tableпакет:

library(data.table)
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | funzip")

В случаях, когда архив содержит несколько файлов, вы можете использовать tar вместо того, чтобы извлечь конкретный файл в стандартный вывод:

dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")
5 голосов
/ 16 августа 2017

Вот пример, который работает для файлов, которые не могут быть прочитаны с помощью функции read.table. Этот пример читает файл .xls.

url <-"https://www1.toronto.ca/City_Of_Toronto/Information_Technology/Open_Data/Data_Sets/Assets/Files/fire_stns.zip"

temp <- tempfile()
temp2 <- tempfile()

download.file(url, temp)
unzip(zipfile = temp, exdir = temp2)
data <- read_xls(file.path(temp2, "fire station x_y.xls"))

unlink(c(temp, temp2))
4 голосов
/ 13 июня 2016

Попробуйте этот код. У меня это работает:

unzip(zipfile="<directory and filename>",
      exdir="<directory where the content will be extracted>")

Пример:

unzip(zipfile="./data/Data.zip",exdir="./data")
3 голосов
/ 02 февраля 2017

Чтобы сделать это с помощью data.table, я обнаружил, что работает следующее. К сожалению, ссылка больше не работает, поэтому я использовал ссылку для другого набора данных.

library(data.table)
temp <- tempfile()
download.file("https://www.bls.gov/tus/special.requests/atusact_0315.zip", temp)
timeUse <- fread(unzip(temp, files = "atusact_0315.dat"))
rm(temp)

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

...