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?


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, 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)

5
Jangan gunakan scan(); Anda dapat menggunakan read.table()dkk secara langsung pada koneksi. Lihat jawaban saya yang diedit,
Dirk Eddelbuettel


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")

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))

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.


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")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.