Прочтите zipped-CSV файл в R

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

В основном у меня много файлов .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'

Любая помощь будет очень признательна, спасибо заранее.

Ответ 1

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

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

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

НО, если вы планируете что-то сделать с кусками данных, например, для суммирования, вы можете использовать итераторы пакетов. Я приведу пример использования, чтобы показать, как это можно сделать. Получите данные авиакомпании 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, Н. А., Н. А., Н. А., Н. А., Н. А."

> nextElem(it) 

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

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

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

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

Ответ 2

Если я правильно понял вопрос, по крайней мере, в ОС 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"))

Чем вы просто читаете .table()... Это работает для меня.

Ответ 3

Согласно документации пакета readr, readr::read_csv и сотрудники автоматически разархивируют файлы, заканчивающиеся на .gz, .bz2, .xz или .zip. Хотя .7z не упоминается, возможно, решение состоит в том, чтобы перейти на один из этих форматов сжатия и затем использовать readr (что также предлагает ряд других преимуществ). Если ваши данные сжаты с zip, ваш код будет:

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