Как импортировать CSV файлы в таблицу PostgreSQL?

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

Ответ 1

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


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

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

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);

Ответ 2

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

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

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

Ответ 3

Одним из быстрых способов сделать это является использование библиотеки панд 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:[email protected]: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]

Ответ 4

Вы также можете использовать 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 
)

Ответ 5

Как сказал Павел, импорт работает в pgAdmin:

щелкните правой кнопкой мыши по таблице → import

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

здесь представлен немецкий скриншот графического интерфейса пользователя pgAdmin:

pgAdmin import GUI

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

щелкните правой кнопкой мыши по таблице → Импортировать данные таблицы...

DbVisualizer import GUI

Ответ 6

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

Предоставляя путь и количество столбцов вашего 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;

Ответ 7

COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;

Ответ 8

Личный опыт работы с 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/

Ответ 9

  1. сначала создайте таблицу

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

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

Спасибо

Ответ 10

Используйте этот код 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/

Ответ 12

Создайте таблицу и введите необходимые столбцы, которые используются для создания таблицы в файле csv.

  • Откройте postgres и щелкните правой кнопкой мыши на целевой таблице, которую вы хотите загрузить, и выберите импорт и обновите следующие шаги в разделе параметры файла

  • Теперь просмотрите файл в имени файла

  • Выберите csv в формате

  • Кодирование как ISO_8859_5

Теперь перейти Разное. options и проверьте заголовок и нажмите на импорт.

Ответ 13

Если вам нужен простой механизм для импорта из текстового/синтаксического анализа многострочного CSV, вы можете использовать:

CREATE TABLE t   -- OR INSERT INTO tab(col_names)
AS
SELECT
   t.f[1] AS col1
  ,t.f[2]::int AS col2
  ,t.f[3]::date AS col3
  ,t.f[4] AS col4
FROM (
  SELECT regexp_split_to_array(l, ',') AS f
  FROM regexp_split_to_table(
$$a,1,2016-01-01,bbb
c,2,2018-01-01,ddd
e,3,2019-01-01,eee$$, '\n') AS l) t;

DBFiddle Demo

Ответ 14

В Python вы можете использовать этот код для автоматического создания таблицы PostgreSQL с именами столбцов:

import pandas, csv

from io import StringIO
from sqlalchemy import create_engine

def psql_insert_copy(table, conn, keys, data_iter):
    dbapi_conn = conn.connection
    with dbapi_conn.cursor() as cur:
        s_buf = StringIO()
        writer = csv.writer(s_buf)
        writer.writerows(data_iter)
        s_buf.seek(0)
        columns = ', '.join('"{}"'.format(k) for k in keys)
        if table.schema:
            table_name = '{}.{}'.format(table.schema, table.name)
        else:
            table_name = table.name
        sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(table_name, columns)
        cur.copy_expert(sql=sql, file=s_buf)

engine = create_engine('postgresql://user:[email protected]:5432/my_db')

df = pandas.read_csv("my.csv")
df.to_sql('my_table', engine, schema='my_schema', method=psql_insert_copy)

Это также относительно быстро, я могу импортировать более 3,3 миллиона строк примерно за 4 минуты.

Ответ 15

Как импортировать данные файла CSV в таблицу PostgreSQL?

шаги:

  1. Необходимо подключить базу данных postgresql в терминале

    psql -U postgres -h localhost
    
  2. Нужно создать базу данных

    create database mydb;
    
  3. Необходимо создать пользователя

    create user siva with password 'mypass';
    
  4. Связаться с базой данных

    \c mydb;
    
  5. Нужно создать схему

    create schema trip;
    
  6. Нужно создать таблицу

    create table trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount
    );
    
  7. Импорт данных CSV файла в postgresql

    COPY trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount) FROM '/home/Documents/trip.csv' DELIMITER ',' CSV HEADER;
    
  8. Найти данные данной таблицы

    select * from trip.test;
    

Ответ 16

Я создал небольшой инструмент, который импортирует csv файл в PostgreSQL очень просто, просто команда, и он будет создавать и заполнять таблицы, к сожалению, в настоящий момент все автоматически созданные поля используют тип TEXT

csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase

Этот инструмент можно найти на https://github.com/eduardonunesp/csv2pg.

Ответ 17

Возможно, этот инструмент будет полезен http://www.convertcsv.com/csv-to-sql.htm Он имеет множество конфигурационных параметров для преобразования из CSV в базу данных script.