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

时间:2010-06-16 13:52:05

标签: r zip connection

Twitter上的@EZGraphs写道: “有很多在线csv被压缩。有没有办法下载,解压缩存档,并使用R?#Rstats将数据加载到data.frame”

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

我尝试过类似的事情:

fileName <- "http://www.newcl.org/data/zipfiles/a1.zip"
con1 <- unz(fileName, filename="a1.dat", open = "r")
但是我觉得我还有很长的路要走。 有什么想法吗?

9 个答案:

答案 0 :(得分:160)

Zip档案实际上更像是一个包含内容元数据等的“文件系统”。有关详细信息,请参阅help(unzip)。所以要做你上面描绘的你需要

  1. 创建一个临时文件。文件名(例如tempfile()
  2. 使用download.file()将文件提取到temp中。文件
  3. 使用unz()从temp中提取目标文件。文件
  4. 通过unlink()
  5. 删除临时文件

    在代码中(感谢基本示例,但这更简单)看起来像

    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)文件只是文件以及您可以直接从连接中读取的文件。因此,请让数据提供者使用它:)

答案 1 :(得分:27)

为了记录,我尝试将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)

答案 2 :(得分:17)

我在http://cran.r-project.org/web/packages/downloader/index.html使用了CRAN软件包“downloader”。更容易。

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

答案 3 :(得分:6)

对于Mac(我假设是Linux)......

如果zip存档包含单个文件,您可以使用bash命令funzipfread包中的data.table结合使用:

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

答案 4 :(得分:5)

以下示例适用于无法使用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 :(得分:4)

试试这段代码。它对我有用:

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

示例:

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

答案 6 :(得分:3)

要使用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文件,提取并将单个文件传递给{{ 1}}。

答案 7 :(得分:0)

我发现以下对我有用。这些步骤来自BTD的YouTube视频Managing Zipfile's in R

zip.url <- "url_address.zip"

dir <- getwd()

zip.file <- "file_name.zip"

zip.combine <- as.character(paste(dir, zip.file, sep = "/"))

download.file(zip.url, destfile = zip.combine)

unzip(zip.file)

答案 8 :(得分:0)

rio() 非常适合这种情况 - 它使用文件名的文件扩展名来确定它是什么类型的文件,因此它可以处理多种文件类型。我还使用 unzip() 列出了 zip 文件中的文件名,因此无需手动指定文件名。

library(rio)

# create a temporary directory
td <- tempdir()

# create a temporary file
tf <- tempfile(tmpdir=td, fileext=".zip")

# download file from internet into temporary location
download.file("http://download.companieshouse.gov.uk/BasicCompanyData-part1.zip", tf)

# list zip archive
file_names <- unzip(tf, list=TRUE)

# extract files from zip file
unzip(tf, exdir=td, overwrite=TRUE)

# use when zip file has only one file
data <- import(file.path(td, file_names$Name[1]))

# use when zip file has multiple files
data_multiple <- lapply(file_names$Name, function(x) import(file.path(td, x)))

# delete the files and directories
unlink(td)