Jer*_*lim 118 connection zip r
@EZGraphs在Twitter上写道:"很多在线csv都是压缩的.有没有办法下载,解压缩档案,并使用R?#Rstats将数据加载到data.frame"
我今天也试图这样做,但最终只是手动下载zip文件.
我尝试过类似的东西:
fileName <- "http://www.newcl.org/data/zipfiles/a1.zip"
con1 <- unz(fileName, filename="a1.dat", open = "r")
Run Code Online (Sandbox Code Playgroud)
但我觉得我还有很长的路要走.有什么想法吗?
Dir*_*tel 165
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)
Run Code Online (Sandbox Code Playgroud)
压缩(.z
)或gzipped(.gz
)或bzip2ed(.bz2
)文件只是文件和您可以直接从连接读取的文件.所以让数据提供者使用它:)
Geo*_*tas 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)
Run Code Online (Sandbox Code Playgroud)
小智 17
我在http://cran.r-project.org/web/packages/downloader/index.html上使用了CRAN软件包"downloader" .更容易.
download(url, dest="dataset.zip", mode="wb")
unzip ("dataset.zip", exdir = "./")
Run Code Online (Sandbox Code Playgroud)
使用library(archive)
它还可以读取存档中的特定 csv 文件,而无需先解压缩;read_csv(archive_read("http://www.newcl.org/data/zipfiles/a1.zip", file = 1), col_types = cols())
我发现这更方便而且更快。
它还支持所有主要的存档格式,并且比基本的 R untar 或 unz 快得多 - 它支持 tar、ZIP、7-zip、RAR、CAB、gzip、bzip2、compress、lzma、xz 和 uuencoded 文件。
解压所有可以使用的东西archive_extract("http://www.newcl.org/data/zipfiles/a1.zip", dir=XXX)
这适用于所有平台,并且考虑到对我来说优越的性能将是首选。
对于Mac(我假设是Linux)...
如果zip压缩包中包含一个单一的文件,你可以使用bash命令funzip
,与一起选择fread
从data.table
包:
library(data.table)
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | funzip")
Run Code Online (Sandbox Code Playgroud)
如果归档文件包含多个文件,则可以tar
改用将特定文件提取到stdout:
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")
Run Code Online (Sandbox Code Playgroud)
小智 5
要使用 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)
Run Code Online (Sandbox Code Playgroud)
我知道这在一行中是可能的,因为您可以将 bash 脚本fread
传递到fread
.
小智 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))
Run Code Online (Sandbox Code Playgroud)