2010-06-07 4 views
442

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

+10

Почему хранимая процедура? COPY делает трюк –

+0

У меня есть пользовательский интерфейс, который загружает файл CSV, чтобы подключить до этого мне нужно хранимая процедура, которая фактически копирует данные из CVS файл – vardhan

+0

Вот что делает COPY ... –

ответ

640

Посмотрите на это short article.


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

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

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

Фактически использование \ copy будет делать тот же трюк, если у вас нет доступа суперпользователя; он жалуется на мою Fedora 16 при использовании COPY с учетной записью без полномочий. – asksw0rder

+72

СОВЕТ. Вы можете указать, какие столбцы у вас есть в CSV, используя zip_codes (col1, col2, col3). Столбцы должны быть перечислены в том же порядке, что и в файле. –

+1

@ asksw0rder does \ copy имеют одинаковый синтаксис? bcoz Я получаю синтаксическую ошибку с \ copy – JhovaniC

27

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

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

CREATE TABLE my_table (
    /*paste data from Excel here for example ... */ 
    col_1 bigint, 
    col_2 bigint, 
    /* ... */ 
    col_n bigint 
) 
50

один быстрый способ сделать это с помощью библиотеки 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 is 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] 
+5

Кроме того, 'if_exists' параметр может быть установлен, чтобы заменить или добавить в существующую таблицу, например,' df.to_sql («fhrs», двигатель, if_exists = «заменить») ' –

+0

имя пользователя и пароль: необходимо создать логин и назначить БД пользователю.Если используется pgAdmin, затем создайте «роль входа/группы» с помощью GUI. –

+2

Pandas - это очень медленный способ загрузки в sql (vs csv-файлы). Может быть на несколько порядков медленнее. – user48956

13

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

Обеспечение пути и столбцов подсчет вашего файла 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 
    set schema 'your-schema'; 

    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; 
+0

Привет, Мехмет, спасибо за ответ, который вы отправили, но когда я запустил ваш код, я получаю следующее сообщение об ошибке: ERROR: «данных» схемы нет. – user2867432

+0

user2867432 вам необходимо изменить имя схемы, которое вы используете соответствующим образом (например, 'public') – mehmet

+0

Привет, Мехмет, спасибо за решение, это прекрасно, но это работает только в том случае, если пользователь Postgres DB является суперпользователем, и любой способ заставить его работать без суперпользователя? – Geeme

127

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

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

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 
+0

\ копировать избирателей (ZIP, CITY) FROM '/Users/files/Downloads/WOOD.TXT' DELIMITER ',' CSV HEADER; ОШИБКА: дополнительные данные после последнего ожидаемого столбца КОНТЕКСТ: избиратели КОПИИ, строка 2: «OH0012781511,87,26953, ДОМОХОЗЯЙКА, ШЕРРИ, LEIGH ,, 11/26/1965,08/19/1988,, 211 N GARFIELD ST, , BLOOMD ... " –

+0

@JZ. У меня была аналогичная ошибка. Это потому, что у меня были лишние пустые столбцы. Проверьте свой csv, и если у вас есть пустые столбцы, это может быть причиной. –

+2

Это несколько вводит в заблуждение: разница между 'COPY' и' \ copy' намного больше, чем просто разрешения, и вы не можете просто добавить '' ', чтобы сделать это магически. См. Описание (в контексте экспорта) здесь: http://stackoverflow.com/a/1517692/157957 – IMSoP

18

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

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

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

здесь является немецкий скриншот pgAdmin GUI:

pgAdmin import GUI

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

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

DbVisualizer import GUI

+1

DBVisualizer занял 50 секунд, чтобы импортировать 1400 строк с тремя полями - и мне пришлось отбросить все обратно из String до того, что должно было быть. – Noumenon

3

IMHO, самый удобный способ следовать «Import CSV data into postgresql, the comfortable way ;-)», используя csvsql из csvkit, который представляет собой пакет питона устанавливаемое через пип ,

+1

Ссылка гниль прожорливая! Статья, с которой вы связались, больше не работает, что делает меня неудобным :( – chbrown

+0

вы можете захотеть упомянуть, что его is py. – mountainclimber

+0

Для меня я получаю MemoryError при попытке импортировать большой CSV, поэтому похоже, что он не работает. – DavidC

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

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

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

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

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

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

В настоящее время сдается Разное. параметры и проверьте заголовок и нажмите на импорт.

4

Личный опыт работы с 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. Когда \ путь \ xxx.csv находится на сервере, PostGreSQL не имеет разрешение для доступа к серверу вам придется импортировать CSV-файл через встроенные функции pgAdmin.

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

enter image description here

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

0

1) создать таблицу первого

2) Затем с помощью команды копирования, чтобы скопировать детали таблицы:

копии table_name (C1, C2, C3) .... из 'путь к файлу `s' csv '', 'csv header;

Thanks

Смежные вопросы