在R中读取一个压缩的csv文件

13
我一直在努力解决这个问题,但我无法理解如何在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'

任何帮助都将不胜感激,提前感谢。

这篇文章可能会有参考价值 - https://dev59.com/a3A75IYBdhLWcg3w4tR7 - zx8754
2
你是否正确设置了工作目录?你的数据文件需要在那里。https://sites.google.com/site/manabusakamoto/home/r-tutorials/r-tutorial-4 - JosefAssad
2
大家好!@zx8754:谢谢,我已经看到这篇文章了,但是我遇到了以下错误: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:C'@Josef Assad:是的,我使用以下代码设置工作目录,并且它总是有效的:rm(list=ls(all=TRUE))Sys.setlocale("LC_TIME", "C") # Windowsrm(list=ls())main_dir <- "C:/Users/.../Forecast-Machine Learning"setwd(main_dir)temp <- tempfile()data <- read.table(unz("substn-20100101.7z",temp))unlink(temp) - bosspe
file.exists("substn-20100101.7z") 返回什么? - Richie Cotton
3
似乎没有人指出7z并不等同于zip。我不知道是否有内置支持的7z - hadley
显示剩余2条评论
3个回答

9
首先,如果您的问题是RAM,就像您所说的每个文件都有22G,使用压缩文件无法解决您的问题。例如,在read.table之后,所有文件都将被加载到内存中。如果您正在使用这些文件进行某种建模,我建议您查看ffbigmemory软件包。
另一个解决方案是使用Revolutions R,它具有学术许可证,您可以免费使用。 Revolutions R提供了大数据功能,您可以使用revoscaleR等软件包轻松管理这些文件。

另一个解决方案是使用Postgres + MADLib + PivotalR。将数据摄取到Postgres中后,使用PivotalR包访问数据,并使用MADLib库在R控制台上直接进行建模。

但是,如果您正在计划处理数据块(例如汇总),则可以使用iterators包。我将提供一个用例来展示如何完成此操作。获取Airlines数据,选取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) 

你将会看到下一行,以此类推。请注意,你是逐行阅读,因此不会将整个文件加载到内存中。
如果你想逐行读取直至文件末尾,可以使用
> tryCatch(expr=nextElem(it), error=function(e) return(FALSE))

例如,当文件结束时,它返回一个逻辑上的FALSE。

1
如果我理解问题正确的话,至少在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"))

谢谢,你刚刚使用了read.table()函数...它对我有用。


1
根据readr软件包文档readr::read_csv等函数会自动解压以.gz.bz2.xz.zip结尾的文件。虽然未提及.7z格式,但也许可以将数据转换为这些压缩格式之一,然后使用readr(还有其他许多好处)。如果您的数据是用zip压缩的,则代码应如下:
library(readr)
data <- read_csv("substn-20100101.csv.zip", n_max=10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接