簡體   English   中英

在R中讀取壓縮的.csv文件

[英]Read a zipped .csv file in R

我一直在努力解決這個問題,但是我無法理解如何在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'

非常感謝任何幫助,謝謝你提前。

首先,如果您的問題是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')

好的,現在您已連接到您的文件了。 讓我們創建一個迭代器:

> 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。

如果我正確理解了這個問題,至少在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"))

比你剛讀完。表()......它對我有用。

根據readr包文檔readr::read_csvreadr::read_csv將自動解壓縮以.gz.bz2.xz.zip結尾的.zip 雖然沒有提到.7z ,但也許解決方案是改為其中一種壓縮格式,然后使用readr (這也提供了許多其他好處)。 如果您的數據是使用zip ,那么您的代碼將是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM