2012-03-03 32 views
14

Tôi đang tìm cách tải xuống csv đã nén và tải nó dưới dạng đối tượng R mà không lưu nó trước tiên vào đĩa. Tôi có thể làm điều này với các tệp nén nhưng không thể làm cho nó hoạt động với gzfile hoặc gzcon.Đọc gzipped csv trực tiếp từ url trong R

Ví dụ:

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

Đó tải một (nhỏ) gz tập tin nén chứa Wikipedia article feedback data (không quan trọng, nhưng chỉ để cho thấy nó không phải là khổng lồ hoặc bất chính).

Mã tôi đã hoạt động tốt nhưng tôi cảm thấy như tôi thiếu điều gì đó rất rõ ràng bằng cách sử dụng để tạo và hủy tệp tạm thời.

Trả lời

16

Tôi gần như chắc chắn tôi đã trả lời câu hỏi này một lần trước đây. Kết quả là Kết nối API của R (file(), url(), pipe(), ...) có thể thực hiện giải nén khi đang di chuyển, tôi không nghĩ bạn có thể làm điều đó cho các đối tượng http từ xa.

Vì vậy, thực hiện hai bước mà bạn đã mô tả: sử dụng download.file() với kết quả tempfile() làm đối số thứ hai để tìm nạp tệp đã nén và sau đó đọc từ tệp đó. Là đối tượng tempfile(), nó sẽ tự động được dọn sạch vào cuối phiên R của bạn để sửa lỗi nhỏ nhất tôi có thể đề xuất là bỏ qua unlink() (nhưng sau đó tôi thích dọn dẹp rõ ràng, vì vậy bạn cũng có thể giữ nó).

Edit: Got it:

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 

Mấu chốt là gợi ý các gzcon giúp nó có thể đưa giải nén xung quanh một dòng hiện có. Sau đó, chúng tôi cần đường vòng nhẹ của readLines và đọc qua textConnection từ đó là read.csv muốn quay lại và lui tới dữ liệu (để xác thực chiều rộng cột, tôi giả định).

+0

Vâng tôi gần 70% chắc chắn bạn hoặc JD đã trả lời một cái gì đó tương tự. Tôi thực sự có ý tưởng 'tempfile' từ câu trả lời trước của bạn về các thư mục nén. Nhưng tôi không thể tìm thấy một cái gì đó w/gzfile/gzcon, mà dường như cư xử khác với một số tập tin khác hoặc các chức năng liên quan đến kết nối. –

+0

Bạn có thể chưng cất điều này không? Tôi thực sự sử dụng cùng một mẹo 'streaming' ra khỏi một tập tin gzip'ed trở lại vào đầu những năm 1990 khi không gian đĩa là scarcer và tôi giữ kết quả mô phỏng gzip'ed. Vì vậy, khả năng minh bạch nhận được chức năng "gunzip" vào một thư viện C fread là khá cũ trường học và tiêu chuẩn. –

+0

Tôi sẽ đánh dấu đây là câu trả lời ngay bây giờ. Tôi có thể quay trở lại và cho bản thân mình một câu trả lời tốt hơn sau khi một số lừa xung quanh w/gzcon (mà có vẻ như góc hứa hẹn hơn). –

Các vấn đề liên quan