使用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)
了解详细信息。 所以要做上面的草图,你需要
- 创build一个临时 文件名(例如
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
)文件只是文件 ,您可以直接从连接中读取。 所以让数据提供者使用,而不是:)
为了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命令funzip
与data.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))