使用R下载压缩的数据文件,提取并导入数据

Twitter上的@EZGraphs写道:“许多在线csvs都是压缩的,有没有办法下载,解压缩压缩包,并使用R?#Rstats将数据加载到data.frame中”

我也在尝试今天这样做,但最终只是手动下载zip文件。

我尝试了这样的:

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

但是我感觉好像还有很长的路要走。 有什么想法吗?

Zip档案实际上更多的是具有内容元数据等的“文件系统”。请参阅help(unzip)了解详细信息。 所以要做上面的草图,你需要

  1. 创build一个临时 文件名(例如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 )或gzipped( .gz )或bzip2ed( .bz2 )文件只是文件 ,您可以直接从连接中读取。 所以让数据提供者使用,而不是:)

为了logging,我试着将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) 

我使用了http://cran.r-project.org/web/packages/downloader/index.html上的; CRAN软件包“下载程序”。 更容易。

 download(url, dest="dataset.zip", mode="wb") unzip ("dataset.zip", exdir = "./") 

对于Mac(我假设Linux)…

如果zip压缩文件包含单个文件,则可以使用bash命令funzipdata.table包中的fread结合使用:

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

试试这个代码。 它适用于我:

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

例:

 unzip(zipfile="./data/Data.zip",exdir="./data") 

为了做到这一点使用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 ,但我不知道如何下载一个.zip文件,提取,并传递一个文件从fread

这是一个适用于不能用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))