web-dev-qa-db-ja.com

CSVファイルのデータをPostgreSQLのテーブルにインポートする方法

CSVファイルからデータをインポートしてテーブルにデータを設定するストアドプロシージャを作成する方法を教えてください。

525
vardhan

これを見てください 短い記事


ここで言い換えれば:

テーブルを作成してください:

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);
712
Bozhidar Batsov

COPY(これはdbサーバーで機能する)を使用する許可がない場合は、代わりに\copy(dbクライアントで機能する)を使用できます。 Bozhidar 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
166
bjelli

これを行う簡単な方法の1つは、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]
65
RobinL

インポートを実行するためのGUIを提供するpgAdminを使用することもできます。これは SO thread に示されています。 pgAdminを使用する利点は、リモートデータベースに対しても機能することです。

ただし、以前のソリューションと非常によく似ていますが、テーブルをデータベース上に用意しておく必要があります。各自が独自の解決策を持っていますが、私は通常ExcelでCSVを開き、ヘッダーをコピーし、別のワークシートに特別な転置を貼り付け、対応するデータ型を次の列に配置し、それをコピーしてテキストエディタに貼り付ける以下のような適切なSQLテーブル作成クエリと一緒に。

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

Paulが述べたように、インポートはpgAdminで動作します。

テーブルを右クリック - >インポート

ローカルファイル、フォーマット、コーディングを選択

これがドイツのpgAdmin GUIスクリーンショットです。

pgAdmin import GUI

あなたがDbVisualizerでできることと同じこと(私はライセンスを持っています、無料版についてはわからない)

テーブルを右クリック - >テーブルデータのインポート...

DbVisualizer import GUI

20
Andreas L.

ここでの他のほとんどの解決策はあなたが前もって/手動でテーブルを作成することを必要とします。これは、場合によっては実用的ではない場合があります(たとえば、宛先表に多数の列がある場合)。それで、以下のアプローチは便利になるかもしれません。

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;
17
mehmet
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
15
Timothy Siwula

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はサーバーにアクセスする権限を持っていません。組み込みのpgAdmin機能を通して.csvファイルをインポートする必要があります。

テーブル名を右クリックして[インポート]を選択します。

enter image description here

それでも問題が解決しない場合は、このチュートリアルを参照してください。 http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

6
flowera

私見、最も便利な方法は、 csvsql from csvkit を使用して、 " CSVデータをpostgresqlにインポートする---) "に従うことです。これは、pipでインストール可能なpythonパッケージです。

5
sal

このSQLコードを使う

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

headerキーワードは、csvファイルに属性を持つヘッダがあることをDBMSに知らせます。

詳細については http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

5
djdere
  1. 最初にテーブルを作成する

  2. 次に、copyコマンドを使ってテーブルの詳細をコピーします。

コピー table_name(C1、C2、C3 ...)
から 'csvファイルへのパス' delimiter '、' csvヘッダー。

ありがとう

5
user9130085

Text/parse複数行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デモ

1
Lukasz Szozda

テーブルを作成し、csvファイルでテーブルを作成するために使用される必須の列を持っています。

  1. Postgresを開き、読み込みたいターゲットテーブルを右クリックしてインポートを選択し、 ファイルオプション セクションで以下の手順を更新します

  2. 今すぐファイル名であなたのファイルを閲覧

  3. フォーマットでcsvを選択

  4. ISO_8859_5としてエンコード

今後藤 その他。 options そしてヘッダーをチェックしてインポートをクリック。

0
suriruler

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)

それはまた比較的速いです、私は約4分で330万行以上をインポートすることができます。

0
Marc

私はcsvファイルをPostgreSQLに簡単にインポートする小さなツールを作成しました。これは単なるコマンドです。テーブルを作成してデータを投入します。

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

このツールは https://github.com/eduardonunesp/csv2pg にあります。

0
Eduardo Pereira

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
sivamani