web-dev-qa-db-ja.com

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

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

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

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

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

しかし、私は遠く離れているように感じます。何かご意見は?

114
Jeromy Anglim

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

  1. 一時を作成します。ファイル名(例tempfile()
  2. download.file()を使用して、ファイルをtempにフェッチします。ファイル
  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)ファイルはファイルのみであり、接続から直接読み取ることができます。そのため、代わりにそれを使用するデータプロバイダーを取得します:)

162

記録のために、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)
27
George Dontas

http://cran.r-project.org/web/packages/downloader/index.html にあるCRANパッケージ「downloader」を使用しました。はるかに簡単です。

download(url, dest="dataset.Zip", mode="wb") 
unzip ("dataset.Zip", exdir = "./")
17
unixcreeper

Macの場合(およびLinuxの場合)...

Zipアーカイブに単一のファイルが含まれている場合、data.tableパッケージのfunzipと組み合わせて、bashコマンドfreadを使用できます。

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

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
ColinTea

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

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

例:

unzip(zipfile="./data/Data.Zip",exdir="./data")
4
Marcelo Tibau

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に渡す方法がわかりません。 。

3
Mallick Hossain