[英]Read a zipped .csv file in 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=",")
我收到消息:
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之后,所有文件都將被加載到內存中。 如果您使用這些文件進行某種建模,我建議您查看ff和bigmemory包。
另一種解決方案是使用具有學術許可的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_csv
和readr::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.