2012-03-03 15 views
14

gzipped csvをダウンロードし、ディスクに保存せずにRオブジェクトとしてロードします。私は圧縮されたファイルでこれを行うことができますが、gzfileまたはgzconと動作するように見えません。URLから直接gzipped csvを読んでください。

例:

grabRemote <- function() { 
     temp <- tempfile() 
     download.file("http://dumps.wikimedia.org/other/articlefeedback/aa_combined-20110321.csv.gz", temp) 
     aap.file <- read.csv(gzfile(temp), as.is = TRUE) 
     unlink(temp) 
     return(aap.file) 
    } 

Wikipedia article feedback data含む(小)GZ圧縮ファイルダウンロード(重要ではないが、しかし、ちょうどそれが巨大か極悪ないであることを示すために)。

私が使っているコードはうまくいきますが、一時ファイルを作成して破壊することによって非常に明白なものを見逃しているような気がします。

答えて

16

私はこの質問に以前一度答えました。結論は接続 RのAPI(file()url()pipe()、...)は、その場で圧縮解除を行うことができます、私はあなたがリモートhttpオブジェクトのためにそれを行うことはできないと思います。

説明した2つの手順を実行します。download.file()tempfile()という結果を第2引数として使用し、圧縮ファイルを取得してから読み込みます。 tempfile()オブジェクトのように、Rセッションの終了時に自動的にクリーンアップされるので、私が提案できる1つのマイナーな修正はunlink()をスキップすることです(ただし、明示的なクリーンアップが好きなのでそのまま使用してください)。

編集:がそれを手に入れた:

con <- gzcon(url(paste("http://dumps.wikimedia.org/other/articlefeedback/", 
         "aa_combined-20110321.csv.gz", sep=""))) 
txt <- readLines(con) 
dat <- read.csv(textConnection(txt)) 

dim(dat) 
# [1] 1490 19 

summary(dat[,1:3]) 
# aa_page_id  page_namespace     page_title 
# Min. :  324 Min. :0  United_States  : 79 
# 1st Qu.: 88568 1st Qu.:0  2011_NBA_Playoffs : 52 
# Median : 2445733 Median :0  IPad_2    : 43 
# Mean : 8279600 Mean :0  IPod_Touch   : 38 
# 3rd Qu.:16179920 3rd Qu.:0  True_Grit_(2010_film): 38 
# Max. :31230028 Max. :0  IPhone_4    : 26 
# (Other)    :1214 

キーは、それが既存のストリームの周りに解凍を置くことができることをgzconヘルプのヒントでした。 readLinesのちょっとした迂回路と、textConnectionからの読書が必要です。read.csvはデータの前後に行きたいと思っています(列幅を検証するために、私は推測します)。

+0

ええ私はあなたやJDがほぼ同じように答えていることをほぼ70%確信しています。私は実際にzipフォルダに関するあなたの以前の答えから 'tempfile'アイデアを得ました。しかし、私はgzfile/gzconを見つけることができません。これは、他のファイルや接続関連の関数とは異なる動作をしているようです。 –

+0

これを蒸留できますか?私は実際に、ディスクスペースが乏しく、シミュレーション結果をgzipされたままにしていた1990年代初めに、gzipファイルから「ストリーミング」という同じテクニックを使用しました。したがって、 "gunzip"機能をCライブラリのfreadに透過的に取得する機能は、かなり古い学校であり、標準的です。 –

+0

私はこれを答えとしてマークします。私はgzcon(より有望な角度のように思える)の周りをだまされた後、戻って自分自身に良い答えを与えるかもしれない。 –

関連する問題