R读取zip数据文件而不解压缩


70

我有一个非常大的zip文件,并且尝试将其读入R而不像这样将其解压缩:

temp <- tempfile("Sales", fileext=c("zip"))
data <- read.table(unz(temp, "Sales.dat"), nrows=10, header=T, quote="\"", sep=",")

Error in open.connection(file, "rt") : cannot open the connection
In addition: Warning message:
In open.connection(file, "rt") :
  cannot open zip file 'C:\Users\xxx\AppData\Local\Temp\RtmpyAM9jH\Sales13041760345azip'

这篇文章可能对您有帮助:stackoverflow.com/questions/3053833/…– 2012
山姆

是的,在我问这个问题之前,我已经进行了尽职调查并进行了搜索,与该问题略有不同的是,我尝试从本地文件系统而不是通过URL进行读取。
laiboonh 2012年

您正在使用哪个版本的R?可能值得尝试最新的稳定版本(从项目而不是发行版中,可能会落后)。当unz在两个版本中运行相同的命令时,我已经看到此错误发生在旧版本中,而不是最新版本。
gcbenison

你有没有解决这个问题?
乔恩·M

Answers:


51

如果您的zip文件被调用Sales.zip并且仅包含一个名为的文件Sales.dat,我想您可以简单地执行以下操作(假设该文件位于您的工作目录中):

data <- read.table(unz("Sales.zip", "Sales.dat"), nrows=10, header=T, quote="\"", sep=",")

有没有一种方法可以在不提取文件的情况下找到“ Sales.zip”文件中的文件名?
艾伦·王

4
@AllenWang是的,但是必须改用功能unzipunzip("Sales.zip", list=TRUE)
plannapus

readLines(unz("test.zip","file.txt"))由于某种原因而做的事情不会读到最后一行。知道我该如何解决吗?
by20年

@ by0老实说,没有。对我来说,它按预期工作。也许您应该针对自己的特定问题提出一个新问题?确保提供一个可复制的示例。
普拉纳普斯

18

无需使用unz,因为现在read.table可以直接处理压缩文件:

data <- read.table("Sales.zip", nrows=10, header=T, quote="\"", sep=",")

看到这篇文章


15

readr如果文件后缀表明文件的性质,则该软件包的方法也支持压缩文件,即以.gz,.bz2,.xz或.zip结尾的文件将被自动解压缩。

require(readr)
myData <- read_csv("foo.txt.gz")

1
我不知道!在这里,我首先使用提取zip文件unzip,然后使用readr。感谢您使我的代码更加高效并减少了执行时间!
StatsStudent

3

如果文件是sales.csv,这应该可以正常工作。

data <- readr::read_csv(unzip("Sales.zip", "Sales.csv"))

在不解压缩文件的情况下检查文件名。这有效

unzip("sales.zip", list = TRUE)

2

如果您的系统上安装了zcat(Linux,macos和cygwin就是这种情况),则还可以使用:

zipfile<-"test.zip"
myData <- read.delim(pipe(paste("zcat", zipfile)))

该解决方案还具有不创建临时文件的优点。


2

在此表达式中,您丢失了一个点

temp <- tempfile("Sales", fileext=c("zip"))

它应该是:

temp <- tempfile("Sales", fileext=c(".zip"))

1

gzfile函数以及read_csv和read.table可以读取压缩文件。

library(readr)
df = read_csv(gzfile("file.csv.gz"))

library(data.table)
df = read.table(gzfile("file.csv.gz"))

即使不使用gzfile函数,来自readr包的read_csv仍可以读取压缩文件。

library(readr)  
df = read_csv("file.csv.gz")

建议使用read_csv,因为它比read.table更快

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.