Sıkıştırılmış veri dosyasını indirmek, verileri çıkarmak ve içe aktarmak için R kullanma


122

Twitter'da @EZGraphs şöyle yazıyor: "Birçok çevrimiçi csv sıkıştırılmış. İndirmenin, arşivi açmanın ve verileri R? # Rstats kullanarak bir data.frame'e yüklemenin bir yolu var mı?"

Ben de bugün bunu yapmaya çalışıyordum, ancak sonunda zip dosyasını manuel olarak indirdim.

Şöyle bir şey denedim:

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

ama çok uzakta olduğumu hissediyorum. Düşüncesi olan var mı?


İşe yaradı mı? Öyleyse, neden hala çok uzakta olduğunuzu hissediyorsunuz?
FrustratedWithFormsDesigner

@Frustrated ... Hayır. Sorumdaki kod çalışmıyor. Aşağıdaki cevaplara bakın.
Jeromy Anglim

Yanıtlar:


176

Zip arşivleri aslında içerik meta verileri vb. İçeren bir 'dosya sistemidir'. Ayrıntılar help(unzip)için bakın. Yani yukarıda taslağını çıkardığınız şeyi yapmak için yapmanız gereken

  1. Bir geçici oluşturun. dosya adı (örneğin tempfile())
  2. download.file()Dosyayı geçici belleğe getirmek için kullanın . dosya
  3. unz()Hedef dosyayı temp'den çıkarmak için kullanın . dosya
  4. Geçici dosyayı şu yolla kaldırın: unlink()

kodda (temel örnek için teşekkürler, ancak bu daha basit)

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

Sıkıştırılmış ( .z) veya gzipli ( .gz) veya bzip2ed ( .bz2) dosyalar yalnızca dosyadır ve doğrudan bir bağlantıdan okuyabileceğiniz dosyalardır . Öyleyse veri sağlayıcısına bunu kullanmasını sağlayın :)


Dirk, bir .zarşivden verilerin nasıl çıkarılacağı konusunu genişletebilir misin? İle bir url bağlantısından okuyabilirim readBin(url(x, "rb"), 'raw', 99999999), ancak içerdiği verileri nasıl çıkarırım? uncompressCRAN kaldırıldı paketi - baz R bu mümkündür (ve bu durumda, bu * Nix sistemleri ile sınırlıdır?)? Uygunsa yeni bir soru olarak göndermekten mutluluk duyarız.
jbaums

3
Bakın help(gzfile)- gzip protokolünün artık patentin süresi dolduğu için (çok eski) .z dosyalarını da açabileceğini düşünüyordum. Olmayabilir. Zaten kim kullanıyor? 1980'ler aradı, sıkıştırmalarını geri istiyorlar ;-)
Dirk Eddelbuettel

Teşekkürler - Çalışmasını sağlayamıyorum, bu yüzden belki de desteklenmiyordur. Avustralya Meteoroloji Bürosu, verilerinin bir kısmını maalesef .z olarak sağlıyor!
jbaums

Bilginize Çalışmıyor readRDS()(en azından benim için). Anladığım kadarıyla, dosyanın okuyabileceğiniz türden bir dosyada olması gerekiyor read.table().
jessi

1
ayrıca bağlantıyı da kapatmak isteyeceksiniz. R aynı anda sadece 125 tane açık olabilir. Con <- unz (temp, "a1.dat") gibi bir şey; veri <- read.table (con); Kapat (con);
pdb

28

Sadece kayıt için, Dirk'in cevabını koda çevirmeyi denedim :-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
Kullanmayın scan(); kullanabileceğiniz read.table()bir bağlantı üzerinde doğrudan ve diğ. Düzenlenmiş
cevabıma


9

Mac için (ve Linux varsayıyorum) ...

Zip arşivi tek bir dosya içeriyorsa , paketteki funzipile birlikte bash komutunu kullanabilirsiniz :freaddata.table

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

Arşivin birden fazla dosya içerdiği durumlarda, tarbunun yerine belirli bir dosyayı stdout'a çıkarmak için kullanabilirsiniz :

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

çözümünüzü birden çok dosya için denediğimde, bir hata alıyorumFile is empty:
bshelt141

9

İşte read.tablefonksiyonla okunamayan dosyalar için çalışan bir örnek . Bu örnek bir .xls dosyasını okur.

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

Bunu data.table kullanarak yapmak için aşağıdakilerin çalıştığını buldum. Ne yazık ki, bağlantı artık çalışmıyor, bu yüzden başka bir veri kümesi için bir bağlantı kullandım.

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 komut dosyalarını aktarabileceğiniz için bunun tek bir satırda mümkün olduğunu biliyorum fread, ancak bir .zip dosyasını nasıl indireceğimi, buradan tek bir dosyayı nasıl çıkaracağımı ve fread.


4

Bu kodu deneyin. Benim için çalışıyor:

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

Misal:

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

0

Aşağıdakilerin benim için çalıştığını buldum. Bu adımlar BTD'nin R'deki Zipfile'ları Yönetme adlı YouTube videosundan gelir :

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.