繁体   English   中英

在R中读取压缩的.csv文件

[英]Read a zipped .csv file in R

我一直在努力解决这个问题,但是我无法理解如何在R中读取压缩的.csv文件。我可以首先解压缩文件然后读取它们,但由于解压缩数据量大约为22GB,我猜处理压缩文件更实用。

我基本上有很多.csv文件,我将其逐个压缩成单个.7z文件。 每个文件都命名为: file1.csvfile2.csv等,其压缩分别为: file1.csv.7zfile2.csv.7z等。

如果我使用以下命令:

data <- read.table(unz("substn-20100101.csv.7z", "substn-20100101.csv"), 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 'substn-20100101.7z'

非常感谢任何帮助,谢谢你提前。

首先,如果您的问题是RAM,正如您所说的每个文件都有22G,使用压缩文件将无法解决您的问题。 例如,在read.table之后,所有文件都将被加载到内存中。 如果您使用这些文件进行某种建模,我建议您查看ffbigmemory包。

另一种解决方案是使用具有学术许可的Revolutions R ,您可以免费使用。 Revolutions R提供大数据功能,您可以使用revoscaleR等软件包轻松管理这些文件。

甚至另一种解决方案是使用Postgres + MADLib + PivotalR 在Postgres中摄取数据后,使用PivotalR包访问该数据,并直接从R控制台执行MADLib库模型。

但是,如果您正在计划使用数据块进行的操作,例如摘要,则可以使用包迭代器 我将提供一个用例来说明如何做到这一点。 获取航空公司数据,1988年,并遵循以下代码:

> install.packages('iterators')
> library(iterators)
> con <- bzfile('1988.csv.bz2', 'r')

好的,现在您已连接到您的文件了。 让我们创建一个迭代器:

> it <- ireadLines(con, n=1) ## read just one line from the connection (n=1)

只是为了测试:

> nextElem(it)

你会看到类似的东西:

1 “1988,1,9,6,1348,1331,1458,1435,PI,942,NA,70,64,NA,23,17,SYR,BWI,273,NA,NA,0,NA,0, NA,NA,NA,NA,NA”

> nextElem(it) 

你会看到下一行,依此类推。 请注意,您一次只读一行,因此您不会将所有文件加载到RAM。

如果您想逐行阅读,直到您可以使用的文件结尾

> tryCatch(expr=nextElem(it), error=function(e) return(FALSE))

例如。 文件结束时返回逻辑FALSE。

如果我正确理解了这个问题,至少在Windows操作系统上,您可以使用7-Zip命令行

为简单起见,将7za.exe放入R工作目录(和7zip文件)中,创建.bat文件,其中包含以下文本:

"7za e *.7z -y" 

...比在R中运行以下代码:

my_batch <- "your_bat_file_name.bat"
shell.exec(shQuote(paste(my_batch), type = "cmd"))

比你刚读完。表()......它对我有用。

根据readr包文档readr::read_csvreadr::read_csv将自动解压缩以.gz.bz2.xz.zip结尾的.zip 虽然没有提到.7z ,但也许解决方案是改为其中一种压缩格式,然后使用readr (这也提供了许多其他好处)。 如果您的数据是使用zip ,那么您的代码将是:

library(readr)
data <- read_csv("substn-20100101.csv.zip", n_max=10)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM