#postgresql
#postgresql
Вопрос:
У меня есть CSV-файл с 12 — 11 — 10 или 5 столбцов.
После создания таблицы PostgreSQL с 12 столбцами я хочу скопировать этот CSV-файл в таблицу.
Я использую этот запрос:
COPY absence(champ1, champ2, num_agent, nom_prenom_agent, code_gestion, code_service, calendrier_agent, date_absence, code_absence, heure_absence, minute_absence, periode_absence)
FROM 'C:tempabsenceabsence.csv'
DELIMITER ''
CSV
Мой CSV-файл содержит 80000 строк.
Пример :
205 191MARKEY CLAUDIEGA05111039H0021/02/20201471354Matin
215 191MARKEY CLAUDIEGA05111039H00\81307H48Formation avec repas
305 191MARKEY CLAUDIEGA05143039H00\167H42
229993Temps de déplacement9837
когда я выполняю запрос, я получаю сообщение, указывающее, что отсутствуют данные для строк с менее чем 12 полями.
Есть ли здесь какой-то подвох?
Комментарии:
1. Единственный способ — установить значение по умолчанию для столбцов, которые отсутствуют. Postgresql обработает это автоматически.
Ответ №1:
copy
выполняется чрезвычайно быстро и эффективно, но из-за этого менее гибко. В частности, он не может справиться с файлами, которые имеют разное количество «столбцов» для каждой строки.
Вы можете либо использовать другой инструмент импорта, либо, если вы хотите придерживаться встроенных инструментов, скопировать файл в промежуточную таблицу, содержащую только один столбец, затем использовать строковые функции Postgres для разделения строк на столбцы:
create unlogged table absence_import
(
line text
);
COPY absence_import(line) FROM 'C:tempabsenceabsence.csv' DELIMITER E'b' CSV
E'b'
это символ «backspace», который на самом деле не может отображаться в текстовом файле, поэтому разделение столбцов не происходит.
После того как вы импортировали файл, вы можете разделить строку с помощью string_to_array()
и вставить ее в реальную таблицу:
insert into absence(champ1, champ2, num_agent, nom_prenom_agent, code_gestion, code_service, calendrier_agent, date_absence, code_absence, heure_absence, minute_absence, periode_absence)
select line[1], line[2], line[3], .....
from (
select string_to_array(line, '') as line
from absence_import
) t;
Если есть нетекстовые столбцы, возможно, потребуется явно привести значения к целевому типу данных: например line[3]::int
.
Вы можете добавить дополнительные выражения для обработки отсутствующих столбцов, например, что-то вроде: coalesce(line[10], 'default value')
Комментарии:
1. Я нахожу это: jesuisundev.com/… И все работает нормально … 80000 за 2 минуты, я просто добавляю это: $em-> getconconfiguration()-> setSQLLogger(null); И сбрасываю (synfony / doctrine) на 20 строк. Спасибо всем
2. @jimwest: это то, что я имел в виду, говоря «Вы можете использовать другой инструмент импорта»