Menggunakan R untuk mengunduh file data zip, mengekstrak, dan mengimpor data

122

@EZGraphs di Twitter menulis: "Banyak csv online yang di-zip. Adakah cara untuk mendownload, mengekstrak arsip, dan memuat data ke data.frame menggunakan R? #Rstats"

Saya juga mencoba melakukan ini hari ini, tetapi akhirnya hanya mengunduh file zip secara manual.

Saya mencoba sesuatu seperti:

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

tapi aku merasa seolah-olah aku masih jauh. Ada pemikiran?

Jeromy Anglim
sumber
Apa itu bekerja? Jika demikian, mengapa Anda masih merasa bahwa Anda masih jauh?
FrustratedWithFormsDesigner
@ Frustrasi ... Tidak. kode dalam pertanyaan saya tidak berfungsi. Lihat jawaban di bawah.
Jeromy Anglim

Jawaban:

176

Arsip zip sebenarnya lebih merupakan 'filesystem' dengan metadata konten, dll. Lihat help(unzip)untuk detailnya. Jadi untuk melakukan apa yang Anda buat sketsa di atas, Anda perlu melakukannya

  1. Buat suhu. nama file (mis. tempfile())
  2. Gunakan download.file()untuk mengambil file ke dalam temp. mengajukan
  3. Gunakan unz()untuk mengekstrak file target dari temp. mengajukan
  4. Hapus file temp melalui unlink()

yang dalam kode (terima kasih untuk contoh dasar, tetapi ini lebih sederhana) terlihat

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

File terkompresi ( .z) atau gzip ( .gz) atau bzip2ed ( .bz2) hanyalah file dan yang dapat Anda baca langsung dari sambungan. Jadi minta penyedia data untuk menggunakannya :)

Dirk Eddelbuettel
sumber
Dirk, maukah Anda memperluas tentang cara mengekstrak data dari .zarsip? Saya dapat membaca dari koneksi url dengan readBin(url(x, "rb"), 'raw', 99999999), tetapi bagaimana cara mengekstrak data yang ada di dalamnya? The uncompresspaket telah dihapus dari CRAN - apakah ini mungkin dalam basis R (dan jika demikian, apakah terbatas pada sistem nix *?)? Senang memposting sebagai pertanyaan baru jika sesuai.
jbaums
3
Lihat help(gzfile)- Saya berpikir bahwa protokol gzip sekarang dapat membuka kompresi (batu tua) file .z juga sekarang karena patennya telah lama kedaluwarsa. Mungkin tidak. Siapa yang menggunakan .z? Tahun 1980-an disebut, mereka ingin kompresi mereka kembali ;-)
Dirk Eddelbuettel
Terima kasih - Saya tidak bisa membuatnya berfungsi, jadi mungkin itu tidak didukung sama sekali. Biro Meteorologi Australia memberikan beberapa data mereka sebagai .z, sayangnya!
jbaums
FYI Ini tidak bekerja dengan readRDS()(setidaknya untuk saya). Dari apa yang saya tahu, file tersebut harus dalam jenis file yang dapat Anda baca read.table().
jessi
1
Anda juga akan ingin menutup koneksi. R hanya dapat membuka 125 sekaligus. Sesuatu seperti con <- unz (temp, "a1.dat"); data <- read.table (con); dekat (con);
pdb
28

Sekadar catatan, saya mencoba menerjemahkan jawaban Dirk ke dalam kode :-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)
George Dontas
sumber
5
Jangan gunakan scan(); Anda dapat menggunakan read.table()dkk secara langsung pada koneksi. Lihat jawaban saya yang diedit,
Dirk Eddelbuettel
17

Saya menggunakan paket CRAN "downloader" yang ada di http://cran.r-project.org/web/packages/downloader/index.html . Jauh lebih mudah.

download(url, dest="dataset.zip", mode="wb") 
unzip ("dataset.zip", exdir = "./")
unixcreeper
sumber
2
Saya hanya menggunakan utils :: unzip tidak perlu paket downlaoder untuk saya
mtelesha
pada 2019 - Saya harus mengatakan exdir = '.'
userJT
9

Untuk Mac (dan saya menganggap Linux) ...

Jika arsip zip berisi satu file, Anda dapat menggunakan perintah bash funzip, bersama dengan freaddari data.tablepaket:

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

Jika arsip berisi banyak file, Anda dapat menggunakan taruntuk mengekstrak file tertentu ke stdout:

dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")
dnlbrky.dll
sumber
ketika saya mencoba solusi Anda untuk banyak file, saya mendapatkan kesalahan yangFile is empty:
bshelt141
9

Berikut adalah contoh yang berfungsi untuk file yang tidak dapat dibaca dengan read.tablefungsi tersebut. Contoh ini membaca file .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
sumber
5

Untuk melakukan ini menggunakan data.table, saya menemukan bahwa yang berikut berfungsi. Sayangnya, tautan tersebut tidak berfungsi lagi, jadi saya menggunakan tautan untuk kumpulan data lain.

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)

Saya tahu ini dimungkinkan dalam satu baris karena Anda dapat mengirimkan skrip bash ke fread, tetapi saya tidak yakin bagaimana cara mengunduh file .zip, mengekstrak, dan meneruskan satu file dari itu ke fread.

Mallick Hossain
sumber
4

Coba kode ini. Ini bekerja untuk saya:

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

Contoh:

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