Как импортировать данные файла CSV в таблицу PostgreSQL? - PullRequest
535 голосов
/ 07 июня 2010

Как мне написать хранимую процедуру, которая импортирует данные из файла CSV и заполняет таблицу?

Ответы [ 16 ]

716 голосов
/ 07 июня 2010

Взгляните на эту короткую статью .


Решение перефразировано здесь:

Создайте свою таблицу:

CREATE TABLE zip_codes 
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision, 
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);

Скопируйте данные из вашего CSV-файла в таблицу:

COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' WITH (FORMAT csv);
173 голосов
/ 20 июня 2015

Если у вас нет разрешения на использование COPY (который работает на сервере БД), вы можете использовать \copy (который работает в клиенте БД). Используя тот же пример, что и Божидар Бацов:

Создайте свою таблицу:

CREATE TABLE zip_codes 
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision, 
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);

Скопируйте данные из вашего CSV-файла в таблицу:

\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV

Вы также можете указать столбцы для чтения:

\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
65 голосов
/ 18 апреля 2015

Одним из быстрых способов сделать это является использование библиотеки панд Python (лучше всего работает версия 0.15 или выше). Это будет обрабатывать создание столбцов для вас - хотя, очевидно, выбор, который он делает для типов данных, может оказаться не тем, что вам нужно. Если это не совсем то, что вам нужно, вы всегда можете использовать код 'create table', сгенерированный как шаблон.

Вот простой пример:

import pandas as pd
df = pd.read_csv('mypath.csv')
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces

from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/dbname')

df.to_sql("my_table_name", engine)

А вот код, который показывает вам, как установить различные параметры:

# Set it so the raw sql output is logged
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

df.to_sql("my_table_name2", 
          engine, 
          if_exists="append",  #options are ‘fail’, ‘replace’, ‘append’, default ‘fail’
          index=False, #Do not output the index of the dataframe
          dtype={'col1': sqlalchemy.types.NUMERIC,
                 'col2': sqlalchemy.types.String}) #Datatypes should be [sqlalchemy types][1]
28 голосов
/ 03 ноября 2014

Вы также можете использовать pgAdmin, который предлагает графический интерфейс для импорта.Это показано в этой теме SO .Преимущество использования pgAdmin заключается в том, что он также работает для удаленных баз данных.

Как и в предыдущих решениях, ваша таблица должна быть уже в базе данных.У каждого человека есть свое решение, но я обычно открываю CSV в Excel, копирую заголовки, вставляю специальные с транспозицией в другой лист, помещаю соответствующий тип данных в следующий столбец, затем просто копирую и вставляю его в текстовый редактор.вместе с соответствующим запросом на создание таблицы SQL, например:

CREATE TABLE my_table (
    /*paste data from Excel here for example ... */
    col_1 bigint,
    col_2 bigint,
    /* ... */
    col_n bigint 
)
20 голосов
/ 17 сентября 2015

Как упомянул Пол, импорт работает в pgAdmin:

клик правой кнопкой мыши по таблице -> импорт

выберите локальный файл, формат и кодировку

вот скриншот немецкого pgAdmin GUI:

pgAdmin import GUI

аналогичное, что вы можете сделать с DbVisualizer (у меня есть лицензия, я не уверен насчет бесплатной версии)

щелчок правой кнопкой мыши по таблице -> Импорт данных таблицы ...

DbVisualizer import GUI

18 голосов
/ 06 мая 2015

Большинство других решений здесь требуют, чтобы вы создали таблицу заранее / вручную. Это может быть непрактичным в некоторых случаях (например, если у вас много столбцов в таблице назначения). Таким образом, подход ниже может пригодиться.

Предоставляя путь и количество столбцов вашего CSV-файла, вы можете использовать следующую функцию для загрузки вашей таблицы во временную таблицу, которая будет именоваться как target_table:

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

create or replace function data.load_csv_file
(
    target_table text,
    csv_path text,
    col_count integer
)

returns void as $$

declare

iter integer; -- dummy integer to iterate columns with
col text; -- variable to keep the column name at each iteration
col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet

begin
    create table temp_table ();

    -- add just enough number of columns
    for iter in 1..col_count
    loop
        execute format('alter table temp_table add column col_%s text;', iter);
    end loop;

    -- copy the data from csv file
    execute format('copy temp_table from %L with delimiter '','' quote ''"'' csv ', csv_path);

    iter := 1;
    col_first := (select col_1 from temp_table limit 1);

    -- update the column names based on the first row which has the column names
    for col in execute format('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first)
    loop
        execute format('alter table temp_table rename column col_%s to %s', iter, col);
        iter := iter + 1;
    end loop;

    -- delete the columns row
    execute format('delete from temp_table where %s = %L', col_first, col_first);

    -- change the temp table name to the name given as parameter, if not blank
    if length(target_table) > 0 then
        execute format('alter table temp_table rename to %I', target_table);
    end if;

end;

$$ language plpgsql;
16 голосов
/ 16 ноября 2016
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
7 голосов
/ 22 декабря 2017
  1. сначала создать таблицу

  2. Затем используйте команду copy, чтобы скопировать данные таблицы:

копия имя_таблицы (C1, C2, C3 ....)
из 'путь к вашему CSV-файлу' разделитель ',' заголовок CSV;

Спасибо

7 голосов
/ 26 июля 2017

Личный опыт работы с PostgreSQL, все еще в ожидании более быстрого пути.

1. Сначала создайте скелет таблицы, если файл хранится локально:

    drop table if exists ur_table;
    CREATE TABLE ur_table
    (
        id serial NOT NULL,
        log_id numeric, 
        proc_code numeric,
        date timestamp,
        qty int,
        name varchar,
        price money
    );
    COPY 
        ur_table(id, log_id, proc_code, date, qty, name, price)
    FROM '\path\xxx.csv' DELIMITER ',' CSV HEADER;

2. Когда \ path \ xxx.csv находится на сервере, postgreSQL не имеет Для доступа к серверу вам нужно будет импортировать файл .csv через встроенную функциональность pgAdmin. Щелкните правой кнопкой мыши имя таблицы и выберите импорт.

enter image description here

Если проблема не устранена, обратитесь к этому руководству. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

6 голосов
/ 12 января 2017

Используйте этот код SQL

    copy table_name(atribute1,attribute2,attribute3...)
    from 'E:\test.csv' delimiter ',' csv header

ключевое слово header позволяет СУБД знать, что файл csv имеет заголовок с атрибутами

для дальнейшего посещения http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

...