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

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

Ответы [ 16 ]

5 голосов
/ 07 ноября 2015

ИМХО, наиболее удобный способ - следовать " Импортировать данные CSV в postgresql, удобным способом; -) ", используя csvsql из csvkit , Это пакет Python, устанавливаемый через pip.

0 голосов
/ 08 июня 2019

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

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

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

0 голосов
/ 28 мая 2019

Как импортировать данные из файла 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;
    
0 голосов
/ 26 апреля 2019

В 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:password@localhost: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 минуты.

0 голосов
/ 23 апреля 2018

Если вам нужен простой механизм для импорта из текстового / синтаксического анализа многострочного 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

0 голосов
/ 04 июля 2017

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

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

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

  3. Выберите CSV в формате

  4. Кодировка ISO_8859_5

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

...