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

时间:2014-02-17 13:46:28

标签: r csv

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

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

3 个答案:

答案 0 :(得分:6)

首先,如果您的问题是RAM,正如您所说的每个文件都有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&#34; 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&#34;

> nextElem(it) 

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

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

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

。当文件结束时,返回逻辑FALSE。

答案 1 :(得分:1)

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

为简单起见,将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()... 它对我有用。

答案 2 :(得分:0)

根据readr package documentationreadr::read_csv,伙伴将自动解压缩以.gz.bz2.xz.zip结尾的文件。尽管没有提到.7z,但是也许一种解决方案是更改为这些压缩格式中的一种,然后使用readr(这还提供了许多其他好处)。如果您的数据使用zip压缩,则您的代码应为:

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