Чтение csv с помощью sqldf

#r #sqldf

#r #sqldf

Вопрос:

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

Я пробовал это:

 test <- read.csv.sql("D:\X17065382\Documents\cad\2016_mar\2016_domicilio_mar.csv", sql = "select * from file  limit 5", header = TRUE, sep = ",", eol = "n")
  

но у меня возникла эта проблема:

Ошибка в файле connection_import_file (conn@ptr, имя, значение, sep, eol, пропуск): RS_sqlite_import: D:X17065382Documentscad2016_mar2016_domicilio_mar.csv в строке 198361 ожидалось 1 столбец данных, но найдено 2

Комментарии:

1. Сообщение об ошибке действительно говорит само за себя. Строка 198361 содержит 2 поля данных, тогда как все предыдущие строки содержат одно поле.

2. Также обратите внимание, что filter= аргумент можно использовать в read.csv.sql

Ответ №1:

Если вы не слишком разборчивы в том, какой пакет вы используете, data.table имеет отличную функцию для выполнения именно того, что вам нужно

 library(data.table)

file <- "D:\X17065382\Documents\cad\2016_mar\2016_domicilio_mar.csv"

fread(file, nrows = 5)
  

Комментарии:

1. Возникла эта проблема: Ошибка во fread (file = nomes_cad_2016, nrows = 5): файл размером 0 ТБ (3452861433 байта) открыт нормально, но не удалось отобразить его в памяти. Это 32-битный процесс. Пожалуйста, обновитесь до 64-разрядной версии.

2. И это не решило бы мою проблему, потому что я хотел бы прочитать все строки (7 миллионов) и некоторые из 150 столбцов. Я не смог прочитать весь файл из-за нехватки памяти, поэтому я пытаюсь прочитать только некоторую его часть.

3. вы также можете использовать col.names аргумент в fread , чтобы указать, из каких столбцов читать. Если у вас проблемы с памятью, sqldf не поможет: вам было бы лучше загрузить данные в базу данных

4. О, это хорошая идея, это действительно решает мою проблему. Я попробовал с некоторыми данными и у меня получилось, но когда я попробовал с данными, которые мне нужны, я получил ошибку: > Ошибка во fread («D:\X17065382\Documents\cad\2016_mar\2016_domicilio_mar.csv «, : Нормально открыл файл объемом 0 ТБ (1045835468 байт), но не смог отобразить его в памяти. Это 32-битный процесс. Пожалуйста, обновитесь до 64-разрядной версии.

5. Попробуйте перейти на 64-разрядную версию R в глобальных параметрах

Ответ №2:

Как сказал Shinobi_Atobe, fread() функция из data.table работает действительно хорошо. Если вы предпочитаете использовать базовый R, вы могли бы также использовать : read.csv() или read.csv2() .

т. е.:

 read.csv2(file_path, nrows = 5)
  

Также, что вы подразумеваете под «большими файлами»? 1 ГБ, 10 ГБ, 100 ГБ?

Комментарии:

1. Попробовал, и я получил эту ошибку: Ошибка: не удается выделить вектор размером 0 Кб Ошибка во время свертки: не удалось выделить память (0 Мб) в функции C ‘R_AllocStringBuffer’

2. И это не решило бы мою проблему, потому что я хотел бы прочитать все строки (7 миллионов) и некоторые из 150 столбцов. Я не смог прочитать весь файл из-за нехватки памяти, поэтому я пытаюсь прочитать только некоторую его часть.

3. Вы получаете эту ошибку при выполнении: read.csv2(«D:\X17065382\Documents\cad\2016_mar\2016_domicilio_mar.csv «, nrows = 5) ? Я использую эту функцию для загрузки более 5 ГБ .CSV без каких-либо проблем. Каков размер ваших данных?

4. Ну, вы сказали, что хотите прочитать только некоторые строки, вот почему я подумал, что read.csv () сработал бы для вас. Но без выборки данных довольно сложно выяснить, в чем проблема, потому что даже с read.csv.sql () я заставляю это работать.

5. О, я неправильно вставил (header = TRUE, sep = «,»), моя ошибка. Это сработало. С помощью этого, я думаю, я собираюсь прочитать имена столбцов и поместить файл в postgres, чтобы прочитать все строки из некоторых столбцов. Это будет более длительный способ, чем чтение столбцов, которые я хотел использовать в пакете sqldf, но это сработает. Спасибо

Ответ №3:

У меня это работает.

 require(sqldf)
df <- read.csv.sql("C:\your_path\CSV1.csv", "select * from file where Name='Asher'")
df