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

标签 r csv

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

我收到消息:
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'

任何帮助将不胜感激,在此先感谢您。

最佳答案

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

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

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

但是,如果您正在计划使用大块数据完成的事情,例如摘要,您可以使用包 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) 

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

如果您想逐行阅读直到文件末尾,您可以使用
> tryCatch(expr=nextElem(it), error=function(e) return(FALSE))

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

关于在 R 中读取压缩的 .csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21830753/

相关文章:

xml - 在 R 中解析 XML 响应

c++ - 如何使用 C++ 从 CSV 文件中读取某些列?

csv - 在 Visualforce 中单击命令按钮时,如何从 apex 页面的字段值生成 csv 文件?

java - 如何使用 CSVReaderHeaderAware 并迭代列

python - 使用文件和路径的最佳实践是什么?

r - 计算斐波那契数列

r - 转置数据集

r - 如何用基础数据替换不等式条件

r - 如何将向量 append 到 R 中的向量列表而不诉诸索引?

pandas - 使用 Pandas 读取 CSV 时如何删除 .0