Создать таблицу SQL с правильными типами столбцов из CSV

Я просмотрел несколько вопросов на этом сайте и не могу найти ответ на вопрос: как создать несколько новых таблиц в базе данных (в моем случае я использую PostgreSQL) из нескольких исходных файлов CSV, где столбцы таблицы новой базы данных точно отражают данные в столбцах CSV?

Я могу просто написать синтаксис CREATE TABLE, и я могу прочитать строки/значения CSV файла (ов), но существует ли уже метод для проверки файлов (ов) CSV и точного определения типа столбца? Прежде чем я построил свой собственный, я хотел проверить, действительно ли это уже существует.

Если он еще не существует, я бы хотел использовать модуль Python, CSV и psycopg2 для создания python script, который:

  • Прочитайте CSV файл (ы).
  • Основываясь на подмножестве записей (10-100 строк?), итеративно проверяйте каждый столбец каждой строки, чтобы автоматически определять правильный тип столбца данных в CSV. Поэтому, если строка 1, столбец A имеет значение 12345 (int), но строка 2 столбца A имеет значение ABC (varchar), система автоматически определяет, что он должен быть форматом varchar (5) на основе комбинации данных, найденных в первых двух проходах. Этот процесс может продолжаться столько раз, сколько пользователь счел необходимым определить вероятный тип и размер столбца.
  • Создайте запрос CREATE TABLE, как определено проверкой столбца CSV.
  • Выполните запрос create table.
  • Загрузите данные в новую таблицу.

Существует ли такой инструмент уже в SQL, PostgreSQL, Python или есть другое приложение, которое я должен использовать для выполнения этого (аналогично pgAdmin3)?

Ответ 1

Я имел дело с чем-то подобным, и в итоге написал свой собственный модуль, чтобы обнюхать типы данных, проверив исходный файл. Существует некоторая мудрость среди всех скептиков, но также могут быть причины, которых это стоит делать, особенно когда мы не имеем никакого контроля над форматом входных данных (например, работаем с открытыми данными правительства), поэтому вот некоторые вещи, которые я узнал в процессе:

  • Несмотря на то, что он очень трудоемкий, стоит пробежать весь файл, а не небольшой образец строк. Больше времени тратится на то, что столбец помечен как числовой, который, как оказалось, имеет текст каждые несколько тысяч строк и поэтому не может импортировать.
  • Если вы сомневаетесь, переходите к текстовому типу, потому что его проще накладывать на числовые или дата/время позже, чем пытаться и выводить данные, которые были потеряны при плохом импорте.
  • Проверьте, что ведущие нули в том, что в противном случае являются целыми столбцами, и импортируют их как текст, если они есть, - это обычная проблема с номерами ID/учетной записи.
  • Дайте себе способ вручную переопределить автоматически обнаруженные типы для некоторых столбцов, чтобы вы могли сочетать некоторую смысловую осведомленность с преимуществами автоматической типизации большинства из них.
  • Поля даты/времени - это кошмар, и по моему опыту обычно требуется ручная обработка.
  • Если вы когда-либо добавляли данные в эту таблицу позже, не пытайтесь повторить обнаружение типа - получите типы из базы данных, чтобы обеспечить согласованность.

Если вы можете избежать автоматического обнаружения типов, стоит избегать этого, но это не всегда практично, поэтому я надеюсь, что эти советы помогут.

Ответ 2

Кажется, вам нужно знать структуру спереди. Просто прочитайте первую строку, чтобы узнать, сколько столбцов вы получили.

CSV не несет никакой информации о типе, поэтому его нужно вывести из контекста данных.

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

BEGIN;
CREATE TEMPORARY TABLE foo(a TEXT, b TEXT, c TEXT, ...) ON COMMIT DROP;
COPY foo FROM 'file.csv' WITH CSV;
<do the work>
END;

Слово предупреждения, файл должен быть доступен самому процессу postgresql. Это создает некоторые проблемы с безопасностью. Другой вариант - передать его через STDIN.

НТН