CSVファイルからデータをインポートしてテーブルにデータを取り込むストアドプロシージャを作成するにはどうすればよいですか?
23 に答える
この短い記事を見てください。
ここで言い換えた解決策:
テーブルを作成します。
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);
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 のように、入力データで提供された列値を常に書き込みます。
これを行う簡単な方法の 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]
ここでの他のほとんどのソリューションでは、テーブルを事前に/手動で作成する必要があります。これは、場合によっては実用的でない場合があります (たとえば、宛先テーブルに多数の列がある場合)。したがって、以下のアプローチが役立つ場合があります。
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;
インポートを行うための 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
)
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
最初にテーブルを作成する
次に、copy コマンドを使用してテーブルの詳細をコピーします。
「csvファイルへのパス」区切り文字「、」csvヘッダー
からtable_name(C1、C2、C3 ....)をコピーします。
ありがとう
この 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/ をご覧ください。
私見、最も便利な方法は、「CSVデータをpostgresqlにインポートする、快適な方法;-)」に従うことです.csvkitのcsvsqlを使用します。これは、pip経由でインストール可能なpythonパッケージです。
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 に追加する手順について洞察を提供できますか?
テキスト/解析の複数行 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;