Использование 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)
Ответ 3
Я использовал CRAN-пакет "downloader", найденный в http://cran.r-project.org/web/packages/downloader/index.html. Намного легче.
download(url, dest="dataset.zip", mode="wb")
unzip ("dataset.zip", exdir = "./")
Ответ 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))