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

122

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

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

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

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

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

Джероми Энглим
источник
Это сработало? Если да, то почему вы все еще чувствуете, что до вас далеко?
FrustratedWithFormsDesigner
@ Разочарованный ... Нет. код в моем вопросе не работает. См. Ответы ниже.
Jeromy Anglim

Ответы:

176

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

  1. Создайте темп. имя файла (например tempfile())
  2. Используйте, download.file()чтобы загрузить файл в темп. файл
  3. Используйте unz()для извлечения целевого файла из temp. файл
  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) или gzipped ( .gz) или bzip2ed ( .bz2) файлы - это просто файлы, которые вы можете читать непосредственно из соединения. Поэтому попросите поставщика данных использовать это вместо этого :)

Дирк Эддельбюттель
источник
Дирк, не могли бы вы подробнее рассказать о том, как извлекать данные из .zархива? Я могу читать с URL-адреса readBin(url(x, "rb"), 'raw', 99999999), но как мне извлечь содержащиеся данные? uncompressПакет был удален из CRAN - это возможно в базовом R (и если да, то она ограничена * NIX системы?)? Если возможно, я буду рад разместить новый вопрос.
jbaums
3
Смотрите help(gzfile)- я думал, что протокол gzip теперь может распаковывать (каменные) файлы .z теперь, когда срок действия патента истек. Может и нет. Кто вообще использует .z?
Звонили
Спасибо - я не могу заставить его работать, так что, возможно, он все-таки не поддерживается. К сожалению, Австралийское бюро метеорологии предоставляет некоторые из своих данных в формате .z!
jbaums
FYI Это не работает readRDS()(по крайней мере, для меня). Насколько я могу судить, файл должен быть в виде файла, с которым вы можете читать read.table().
Джесси
1
вы также захотите закрыть соединение. R может иметь только 125 открытых одновременно. Что-то вроде con <- unz (temp, "a1.dat"); data <- read.table (con); близко (CON);
pdb
28

Для записи я попытался перевести ответ Дирка в код :-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)
Джордж Донтас
источник
5
Не используйте scan(); вы можете использовать read.table()et al непосредственно в соединении. См. Мой отредактированный ответ,
Дирк Эддельбюттель,
17

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

download(url, dest="dataset.zip", mode="wb") 
unzip ("dataset.zip", exdir = "./")
unixcreeper
источник
2
Я просто использую utils :: unzip, мне не нужен пакет для
скачивания
по состоянию на 2019 год - я должен был сказать exdir = '.'
userJT
9

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

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

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")
dnlbrky
источник
когда я пробовал ваше решение для нескольких файлов, я получаю сообщение об ошибкеFile is empty:
bshelt141
9

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

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

Маллик Хоссейн
источник
4

Попробуйте этот код. Меня устраивает:

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

Пример:

unzip(zipfile="./data/Data.zip",exdir="./data")
Марсело Тибау
источник
0

Я обнаружил, что у меня сработало следующее. Эти шаги взяты из видео BTD на YouTube, Управление Zip-файлами в R :

zip.url <- "url_address.zip"

dir <- getwd()

zip.file <- "file_name.zip"

zip.combine <- as.character(paste(dir, zip.file, sep = "/"))

download.file(zip.url, destfile = zip.combine)

unzip(zip.file)
Джан Злупко
источник