Использование R для загрузки ZIP файла, извлечения и импорта данных

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

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

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

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

но мне кажется, что я далеко. Любые мысли?

Ответ 1

Zip-архивы на самом деле больше представляют собой "файловую систему" ​​с метаданными контента и т.д. Подробнее см. help(unzip). Чтобы сделать то, что вы набросаете выше, вам нужно

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

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

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

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

Ответ 2

Только для записи я попытался перевести ответ Дирка в код: -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)

Ответ 4

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

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

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

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

dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")

Ответ 5

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

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

Пример:

unzip(zipfile="./data/Data.zip",exdir="./data")

Ответ 6

Чтобы сделать это с помощью 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.

Ответ 7

Вот пример, который работает для файлов, которые невозможно прочитать с помощью функции 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))