直接从R中的url读取Gzip csv

直接从R中的url读取Gzip csv,r,gzip,R,Gzip,我希望下载一个Gzip csv,并将其作为R对象加载,而不首先将其保存到磁盘。我可以用压缩文件来实现这一点,但似乎无法用gzfile或gzcon来实现 例如: grabRemote <- function(url) { temp <- tempfile() download.file(url, temp) aap.file <- read.csv(gzfile(temp), as.is = TRUE) unlink(temp) retur

我希望下载一个Gzip csv,并将其作为R对象加载,而不首先将其保存到磁盘。我可以用压缩文件来实现这一点,但似乎无法用
gzfile
gzcon
来实现

例如:

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

grabRemote我几乎可以肯定我以前回答过这个问题一次。结果是,R(
file()
url()
pipe()
,…)的连接API可以动态进行解压缩,我不认为您可以对远程http对象进行解压缩

因此,请执行您描述的两个步骤:使用
download.file()
tempfile()
结果作为第二个参数来获取压缩文件,然后从中读取。作为
tempfile()

编辑:明白了:

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  

con此函数概括了德克的答案:

R <- function(file_url) {
  con <- gzcon(url(file_url))
  txt <- readLines(con)
  return(read.csv(textConnection(txt)))
}
使用数据。表格::fread:


x是的,我几乎70%肯定你或JD回答了类似的问题。实际上,我是从你之前关于压缩文件夹的回答中得到了tempfile的想法。但是我找不到w/gzfile/gzcon,它的行为似乎与其他一些与文件或连接相关的函数有所不同。你能把它提取出来吗?事实上,早在20世纪90年代初,我就使用了从gzip文件中“流式传输”的相同技巧,当时磁盘空间比较少,我将模拟结果保存在gzip文件中。因此,将“gunzip”功能透明地输入到C库fread中的能力是非常老派和标准的。我现在将此标记为答案。我可能会回来给自己一个更好的答案,在玩了一些w/gzcon(这似乎是一个更有希望的角度)之后。谢谢
gzcon
的提示。这有助于解开谜团。我解开了编辑并添加了一个单独的答案。答案中的长URL拖慢了我的速度,所以我认为这会很有用。
x <- data.table::fread("http://dumps.wikimedia.org/other/articlefeedback/aa_combined-20110321.csv.gz")

dim(x)
[1] 1490   19

x[, 1:2]
#       aa_page_id page_namespace
#    1:   26224556              0
#    2:      31653              0
#    3:   26224556              0
#    4:   26224556              0
#    5:    1058990              0
#   ---                          
# 1486:     619464              0
# 1487:   19283361              0
# 1488:   19006979              0
# 1489:    5078775              0
# 1490:   30209619              0