#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