Как скопировать из CSV в таблицу Posgres и игнорировать столбцы без заголовка - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть скрипт на python, который в основном имеет этот рабочий процесс

  1. Получить CSV с заголовком.
  2. Создать таблицу в базе данных на PostgreSQL, где поля являются заголовками csv.
  3. Скопируйте данные csv в таблицу, созданную в шаге 2

здесь фрагмент кода шага 3

file_object = open(file_csv)
cur = connection.cursor()
copy_sql = """
   COPY %sFROM stdin WITH CSV HEADER
   DELIMITER as '""" + delimiter +"'"

cur.copy_expert(sql=copy_sql % table,file = file_object)
connection.commit()
cur.close()

Этот скрипт работает нормально, но некоторые входные данные csv имеют последние столбцы без заголовка, и приведенный выше код завершается ошибкой

Файл "copy_to_psql.py", строка 18, в load_csv_psql

cur.copy_expert(sql=copy_sql % table,file = file_object)

psycopg2.DataError: дополнительные данные после последнего ожидаемого столбца

Есть ли способ выбрать только столбцы с заголовками из CSV?

Есть ли какое-либо решение, использующее только PostgreSQL?

Есть еще какие-нибудь предложения?

Заранее спасибо

1 Ответ

0 голосов
/ 03 мая 2018

Как уже упоминалось @ABAbhi, мой лучший вариант - очистить CSV.

Итак, в рабочий процесс моего алгоритма я добавляю шаг для удаления столбцов без

  1. Получить CSV с заголовком.
  2. Создайте таблицу в базе данных на PostgreSQL, где поля заголовки csv.
  3. Удалить столбцы без заголовка.
  4. Скопировать данные CSV в таблицу, созданную в шаге 2

И послушайте код шага 3:

def remove_empty_colums(input_csv="in.csv", output_csv="out.csv", delimiter=','):
    reader = csv.DictReader(open(input_csv), delimiter=delimiter)
    headers = reader.fieldnames
    writer = csv.DictWriter(open(output_csv, 'wb'),
                            fieldnames=headers, delimiter=delimiter)
    writer.writeheader()
    for row in reader:
        row_dict = {}
        for header in headers[:-1]:
            row_dict[header] = row[header]
        writer.writerow(row_dict)
...