копировать столбцы CSV-файла в таблицу postgresql

#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: это то, что я имел в виду, говоря «Вы можете использовать другой инструмент импорта»