ज़िपित डेटा फ़ाइल डाउनलोड करने, डेटा निकालने और आयात करने के लिए R का उपयोग करना


122

@EZGraphs ट्विटर पर लिखते हैं: "ऑनलाइन सीएसवी के बहुत सारे ज़िप किए गए हैं। क्या डाउनलोड करने, संग्रह को अनज़िप करने और डेटा का उपयोग करने के लिए डेटा को लोड करने का एक तरीका है? R? Rstats का उपयोग करके?"

मैं भी आज ऐसा करने की कोशिश कर रहा था, लेकिन सिर्फ जिप फाइल को मैनुअली डाउनलोड करना खत्म कर दिया।

मैंने कुछ इस तरह की कोशिश की:

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

लेकिन मुझे लगता है जैसे मैं बहुत दूर हूँ। कोई विचार?


काम किया? यदि हां, तो आप अभी भी क्यों महसूस करेंगे कि आप बहुत दूर हैं?
FrustratedWithFormsDesigner

@ फ़रमाया ... नहीं। मेरे प्रश्न में कोड काम नहीं करता है। नीचे उत्तर देखें।
जेरोमे एंगलिम

जवाबों:


176

जिप अभिलेखागार वास्तव में सामग्री मेटाडाटा आदि के साथ एक 'फाइलसिस्टम' अधिक है help(unzip)। विवरण के लिए देखें। तो क्या आप ऊपर स्केच करने के लिए आप की जरूरत है

  1. एक अस्थायी बनाएँ। फ़ाइल नाम (उदा tempfile())
  2. download.file()फ़ाइल को अस्थायी में लाने के लिए उपयोग करें । फ़ाइल
  3. unz()अस्थायी से लक्ष्य फ़ाइल निकालने के लिए उपयोग करें । फ़ाइल
  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पैकेज क्रैन से हटा दिया गया - आधार आर में यह संभव है (और यदि हां, तो यह * nix सिस्टम तक ही सीमित है?)? यदि उपयुक्त हो तो एक नए प्रश्न के रूप में पोस्ट करने के लिए शुभकामनाएँ।
jbaums

3
देखें help(gzfile)- मैं सोच रहा था कि gzip प्रोटोकॉल अब (पुराना पत्थर) पुराना हो सकता है .z फाइलें भी अब पेटेंट लंबे समय तक समाप्त हो गई हैं। यह नहीं हो सकता है। वैसे भी .z का उपयोग कौन करता है? 1980 के दशक में बुलाया गया था, वे अपने संपीड़न को वापस चाहते हैं ;-)
डिर्क एडल्डबुलेटेल

धन्यवाद - मुझे यह काम करने के लिए नहीं मिल सकता है, इसलिए शायद यह सब के बाद असमर्थित है। ऑस्ट्रेलियाई मौसम विज्ञान ब्यूरो अपने कुछ डेटा .z के रूप में प्रदान करता है, दुर्भाग्य से!
jbaums

FYI करें यह readRDS()मेरे साथ काम नहीं करता है (कम से कम मेरे लिए)। मैं जो बता सकता हूं, उस फ़ाइल को एक तरह की फ़ाइल में होना चाहिए जिसे आप पढ़ सकते हैं read.table()
jessi

1
आप कनेक्शन बंद भी करना चाहेंगे। R केवल एक बार में 125 खुला हो सकता है। कोन जैसा कुछ <- unz (अस्थायी, "a1.dat"); डेटा <- read.table (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()सीधे कनेक्शन पर एट अल का उपयोग कर सकते हैं । मेरा संपादित उत्तर देखें,
डिर्क एडल्डबुलेटेल

17

मैंने http://cran.r-project.org/web/packages/downloader/index.html पर पाए गए CRAN पैकेज "डाउनलोडर" का उपयोग किया । बहुत आसान।

download(url, dest="dataset.zip", mode="wb") 
unzip ("dataset.zip", exdir = "./")

2
मैं सिर्फ मेरे लिए utils का उपयोग :: downlaoder पैकेज के लिए कोई जरूरत नहीं unzip
mtelesha

2019 तक - मुझे एक्सिडिर = 'कहना पड़ा।'
userJT

9

मैक के लिए (और मुझे लगता है कि लिनक्स) ...

यदि ज़िप संग्रह में एक एकल फ़ाइल है, तो आप पैकेज से funzipसंयोजन के साथ bash कमांड का उपयोग कर सकते हैं :freaddata.table

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

जब मैंने कई फ़ाइलों के लिए आपके समाधान की कोशिश की, तो मुझे एक त्रुटि मिल रही है कि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))

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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.