我一直在努力解决这个问题,但是我无法理解如何在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'
非常感谢任何帮助,谢谢你。
答案 0 :(得分:6)
首先,如果您的问题是RAM,正如您所说的每个文件都有22G,使用压缩文件不会解决您的问题。例如,在read.table之后,所有文件都将被加载到内存中。如果您使用这些文件进行某种建模,我建议您查看ff和bigmemory个包。
另一种解决方案是使用具有学术许可的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 documentation,readr::read_csv
,伙伴将自动解压缩以.gz
,.bz2
,.xz
或.zip
结尾的文件。尽管没有提到.7z
,但是也许一种解决方案是更改为这些压缩格式中的一种,然后使用readr
(这还提供了许多其他好处)。如果您的数据使用zip
压缩,则您的代码应为:
library(readr)
data <- read_csv("substn-20100101.csv.zip", n_max=10)