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

bos*_*spe 11 csv r

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

我基本上有很多.csv文件,我将其逐个压缩成单个.7z文件.每个文件被命名,如:file1.csv,file2.csv等等,这些拉链分别变为:file1.csv.7z,file2.csv.7z,等.

如果我使用以下命令:

data <- read.table(unz("substn-20100101.csv.7z", "substn-20100101.csv"), nrows=10, header=T, quote="\"", sep=",")
Run Code Online (Sandbox Code Playgroud)

我收到消息:

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'
Run Code Online (Sandbox Code Playgroud)

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

Fla*_*ros 6

首先,如果您的问题是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')
Run Code Online (Sandbox Code Playgroud)

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

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

只是为了测试:

> nextElem(it)
Run Code Online (Sandbox Code Playgroud)

你会看到类似的东西:

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) 
Run Code Online (Sandbox Code Playgroud)

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

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

> tryCatch(expr=nextElem(it), error=function(e) return(FALSE))
Run Code Online (Sandbox Code Playgroud)

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