701

CSVファイルからデータをインポートしてテーブルにデータを取り込むストアドプロシージャを作成するにはどうすればよいですか?

4

23 に答える 23

852

この短い記事を見てください。


ここで言い換えた解決策:

テーブルを作成します。

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);
于 2010-06-07T06:24:41.463 に答える
288

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 ... は ; なしで 1 行で記述する必要があることに注意してください。最後に!

読み取る列を指定することもできます。

\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV

COPY のドキュメントを参照してください。

COPY を psql 命令の \copy と混同しないでください。\copy は COPY FROM STDIN または COPY TO STDOUT を呼び出し、psql クライアントがアクセスできるファイルにデータをフェッチ/保存します。したがって、\copy が使用されている場合、ファイルのアクセシビリティとアクセス権は、サーバーではなくクライアントに依存します。

そして注意:

ID 列の場合、COPY FROM コマンドは、INSERT オプションの OVERRIDING SYSTEM VALUE のように、入力データで提供された列値を常に書き込みます。

于 2015-06-20T07:26:33.723 に答える
94

これを行う簡単な方法の 1 つは、Python pandas ライブラリを使用することです (バージョン 0.15 以降が最適です)。これにより、列の作成が処理されますが、明らかに、データ型に対して行う選択は、あなたが望むものではないかもしれません. 期待どおりの結果が得られない場合は、テンプレートとして生成された「テーブルの作成」コードをいつでも使用できます。

簡単な例を次に示します。

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]
于 2015-04-18T20:22:01.470 に答える
39

ここでの他のほとんどのソリューションでは、テーブルを事前に/手動で作成する必要があります。これは、場合によっては実用的でない場合があります (たとえば、宛先テーブルに多数の列がある場合)。したがって、以下のアプローチが役立つ場合があります。

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;
于 2015-05-06T17:24:15.263 に答える
33

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

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

CREATE TABLE my_table (
    /*paste data from Excel here for example ... */
    col_1 bigint,
    col_2 bigint,
    /* ... */
    col_n bigint 
)
于 2014-11-03T19:49:20.357 に答える
24
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
于 2016-11-16T19:06:49.497 に答える
20

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

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

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

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

pgAdminインポートGUI

DbVisualizerでできることと同様のこと(ライセンスを持っていますが、無料版についてはわかりません)

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

DbVisualizer インポート GUI

于 2015-09-17T08:55:32.083 に答える
12
  1. 最初にテーブルを作成する

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

「csvファイルへのパス」区切り文字「、」csvヘッダー
からtable_name(C1、C2、C3 ....)をコピーします。

ありがとう

于 2017-12-22T07:33:43.497 に答える
9

この 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/ をご覧ください。

于 2017-01-12T07:27:05.390 に答える
6

私見、最も便利な方法は、「CSVデータをpostgresqlにインポートする、快適な方法;-)」に従うことです.csvkitのcsvsql使用します。これは、pip経由でインストール可能なpythonパッケージです。

于 2015-11-07T09:54:29.800 に答える
5

pgfutter、またはさらに良いのはpgcsvを使用することもできます。

これらのツールは、CSV ヘッダーに基づいてテーブル列を作成します。

pgfutter は非常にバグが多いので、pgcsv をお勧めします。

pgcsv でそれを行う方法は次のとおりです。

sudo pip install pgcsv
pgcsv --db 'postgresql://localhost/postgres?user=postgres&password=...' my_table my_file.csv
于 2019-11-10T21:26:34.643 に答える
1

DBeaver Community Edition (dbeaver.io) を使用すると、データベースへの接続が簡単になり、CSV ファイルをインポートして PostgreSQL データベースにアップロードできます。また、クエリの発行、データの取得、結果セットの CSV、JSON、SQL、またはその他の一般的なデータ形式へのダウンロードも簡単になります。

MySQL、PostgreSQL、SQLite、Oracle、DB2、SQL Server、Sybase、MS Access、Teradata、Firebird、Hive、Presto など、一般的なすべてのデータベースをサポートする、SQL プログラマー、DBA、およびアナリスト向けの FOSS マルチプラットフォーム データベース ツールです。これは、Postgres 用の TOAD、SQL Server 用の TOAD、または Oracle 用の Toad に対する実行可能な FOSS の競合相手です。

私は DBeaver とは何の関係もありません。私は価格 (無料!) とフル機能が気に入っていますが、ユーザーが年間 199 ドルのサブスクリプションの料金を支払うだけでなく、この DBeaver/Eclipse アプリケーションをもっとオープンにして、分析ウィジェットを DBeaver / Eclipse に簡単に追加できるようにしてほしいと思います。アプリケーション内でグラフやチャートを直接作成できます。私の Java コーディング スキルはさびれており、Eclipse ウィジェットの作成方法を再学習するのに何週間も費やす気はありません (DBeaver がサードパーティのウィジェットを DBeaver Community Edition に追加する機能をおそらく無効にしていることがわかりました)。

Java 開発者である DBeaver のパワー ユーザーは、分析ウィジェットを作成して DBeaver の Community Edition に追加する手順について洞察を提供できますか?

于 2019-12-06T04:27:32.787 に答える
1

テキスト/解析の複数行 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 デモ

于 2018-04-23T17:55:40.463 に答える