2014-02-17 8 views
11

Я очень стараюсь это решить, но я не могу понять, как читать zipped .csv-файлы в R. Я мог сначала разархивировать файлы, а затем прочитать их, но поскольку количество распакованных данных составляет около 22 ГБ, я думаю, что более практично обрабатывать сжатые файлы.Прочтите zipped .csv-файл в R

У меня в основном есть много файлов .csv, которые я ZIPPED ONE BY ONE в одиночные .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

Это сообщение может быть уместным - http://stackoverflow.com/questions/3053833/using-r-to-download-zipped-data-file-extract-and-import-data – zx8754

+1

Вы правильно настроили свой рабочий каталог ? Ваш файл данных должен быть там. https://sites.google.com/site/manabusakamoto/home/r-tutorials/r-tutorial-4 – JosefAssad

+1

Привет, оба! @ zx8754: Спасибо, я уже видел сообщение, но я получаю следующую ошибку: Ошибка в open.connection (файл, «rt»): не удается открыть соединение Кроме того: Предупреждение: В открытом .connection (файл, «КТ»): не может открыть почтовый файл «substn-20100101.7z: C» @ Йозеф Асад: да, я использую следующий код, чтобы установить рабочий каталог и он всегда работал: гт (список = Ls (все = TRUE)) Sys.setlocale ("LC_TIME", "C") # Windows гт (список = Ls()) main_dir <- «C:/Users /.../ Forecast-Machine Learning " setwd (main_dir) температура <- TempFile() данные <- read.table (ипг ("substn-20100101.7z", темп)) Unlink (темп) – bosspe

ответ

5

Прежде всего, если ваша проблема в ОЗУ, как вы сказали, у каждого файла есть 22G, использование сжатых файлов не решит ваши проблемы. После read.table, например, весь файл будет загружен в память. Если вы используете эти файлы для какого-то моделирования, я советую вам посмотреть ff и bigmemory.

Другое решение - Revolutions R, имеющее академическую лицензию, и вы можете использовать его бесплатно. Revolutions R предоставляет возможности больших данных, и вы можете легко управлять этими файлами с помощью таких пакетов, как revoscaleR.

Еще одно решение использует Postgres + MADLib + PivotalR. После проглатывания данных в Postgres используйте пакет PivotalR для доступа к этим данным и модели с библиотекой MADLib, непосредственно из консоли R.

НО, если вы планируете что-то сделать с кусками данных, например, резюме, вы можете использовать пакет 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, П. И., 942, Н.А., 70,64, Н.А., 23,17, SYR, БВУ, 273, Н. А., Н. А., 0, Н.А., 0, Н. А., Н. А., Н. А., Н. А., Н. А.»

> nextElem(it) 

, и вы увидите следующий lin e и т. д. Имейте в виду, что вы читаете строку за раз, поэтому вы не загружаете весь файл в ОЗУ.

Если вы хотите построчно до конца файла чтения вы можете использовать

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

, например. Когда файл заканчивается, он возвращает логический FALSE.

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() ... Это работает для меня.

Смежные вопросы