Rを使用してzipデータファイルをダウンロードし、データを抽出してインポートする


122

Twitterの@EZGraphsは、次のように書いています。

私も今日これをやろうとしましたが、手動でzipファイルをダウンロードするだけになりました。

私は次のようなことを試しました:

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

遠く離れているような気がします。何かご意見は?


うまくいきましたか?もしそうなら、なぜあなたはまだあなたが遠く離れていると感じますか?
FrustratedWithFormsDesigner 2010年

@フラストレーション...いや。私の質問のコードは機能しません。以下の回答をご覧ください。
Jeromy Anglim

回答:


176

Zipアーカイブは、実際にはコンテンツメタデータなどを備えた「ファイルシステム」です。詳細help(unzip)については、を参照してください。上でスケッチしたことを行うには、

  1. 臨時雇用者を作成します。ファイル名(例tempfile()
  2. download.file()ファイルを一時ファイルにフェッチするために使用します。ファイル
  3. unz()tempからターゲットファイルを抽出するために使用します。ファイル
  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)またはgzip圧縮(.gz)またはbzip2ed(.bz2)ファイルは単なるファイルであり、接続から直接読み取ることができます。だから、代わりにそれを使用するようにデータプロバイダーを取得してください:)


ダーク、.zアーカイブからデータを抽出する方法について詳しく教えていただけませんか?でURL接続から読み取ることができますreadBin(url(x, "rb"), 'raw', 99999999)が、含まれているデータをどのように抽出しますか?uncompressCRANから削除されたパッケージは、 -ベースRで、この可能です(もしそうなら、それは* nixシステムに制限されていますか?)?必要に応じて、新しい質問として投稿してください。
jbaums

3
参照help(gzfile)-特許の有効期限が切れているため、gzipプロトコルで.zファイルの圧縮が解除される可能性があると考えていました。そうでないかもしれません。とにかく.zを使うのは誰ですか?1980年代に呼ばれた、彼らは彼らの圧縮を戻したいと思っている;-)
Dirk Eddelbuettel 2013

ありがとう-うまく動かせないので、おそらくサポートされていません。オーストラリア気象局は、残念ながらそのデータの一部を.zとして提供しています。
jbaums 2013

FYIそれはreadRDS()(少なくとも私にとって)動作しません。私が知ることができることから、ファイルは、で読み取ることができる一種のファイルである必要がありますread.table()
jessi 2014

1
接続を閉じることもできます。Rは一度に125しかオープンできません。con <-unz(temp、 "a1.dat");のようなもの データ<-read.table(con); close(con);
pdb 2017年

28

念のため、Dirkの回答をコードに変換してみました:-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()接続でet alを直接使用できます。私の編集した回答を参照してください
Dirk Eddelbuettel


9

Mac(およびLinuxを想定)の場合...

zipアーカイブに単一のファイルが含まれている場合は、パッケージfunzipと組み合わせてbashコマンドを使用できます。freaddata.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")

複数のファイルに対してソリューションを試したところ、エラーが発生しましたFile is empty:
bshel​​t141

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に渡すことができるので、これが1行で可能であることはわかっていますが、.zipファイルをダウンロードし、そこから単一のファイルを抽出して渡す方法がわかりませんfread


4

このコードを試してください。わたしにはできる:

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

例:

unzip(zipfile="./data/Data.zip",exdir="./data")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.