我今天也试图这样做,但最终只是手动下载了zip文件。
我尝试过类似的事情:
fileName <- "http://www.newcl.org/data/zipfiles/a1.zip"
con1 <- unz(fileName, filename="a1.dat", open = "r")
但是我觉得我还有很长的路要走。
有什么想法吗?
答案 0 :(得分:160)
Zip档案实际上更像是一个包含内容元数据等的“文件系统”。有关详细信息,请参阅help(unzip)
。所以要做你上面描绘的你需要
tempfile()
)download.file()
将文件提取到temp中。文件unz()
从temp中提取目标文件。文件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
)文件只是文件以及您可以直接从连接中读取的文件。因此,请让数据提供者使用它:)
答案 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命令funzip
与fread
包中的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)