web-dev-qa-db-ja.com

100のCSVファイルをpostgresqlにインポートする

1、2、3 .... 100.csvという名前の100個のcsvファイルがあります。

次のスクリプトでcsvファイルをコピーします。

COPY location FROM 'C:\Program Files\PostgreSQL\9.5\data\´1.csv' DELIMITER ','; 

すべてのファイル(1,2,3 .... 100.csv)をカバーする単一のスクリプトでCOPYを実行します。

MS WindowsでpgadminIIIを使用しています

4
michal

pgScript を使用できます:

DECLARE @i, @filename; 
SET @i = 1;
WHILE @i <= 100 
BEGIN
    SET @filename = 'C:\\Program Files\\PostgreSQL\\9.5\\data\\' + CAST(@i AS STRING) + '.csv' ;
    COPY location FROM '@filename' DELIMITER ',' ; 
    SET @i = @i + 1;
END

注:禁止PostgreSQLデータディレクトリにCSVファイルを配置します。このディレクトリは、ユーザーではなく、データベースエンジンが使用するためのものです。 PostgreSQLファイルを誤って上書きまたは削除すると、データベースが役に立たなくなる可能性があります。

C:\Users\user\Documents\CSV\...または "userland"内の同様の場所のどこかにファイルを保持し、PostgreSQLプロセスが読み取るための適切な権限をそのディレクトリに付与する必要があります。このバージョンの標準インストールでは、通常 LocalSystem アカウントに読み取り権限を与える必要があります。一部のインストールではPostgresアカウントを使用できます)。


注2:pgScriptはそれほど魅力がありませんでした。 pgAdmin 4には移植されていません。


6
joanolo

また、plpgsql匿名ブロックを使用してこれを行うことができるはずです。

do $block$
declare 
  r record;
BEGIN
    for r in select generate_series(1,100) n
    loop
        execute $$COPY location FROM 'C:\Program Files\PostgreSQL\9.5\data\$1.csv' DELIMITER ','$$ using r.n;
    end loop;
end$block$;

私はこれをCOPYでテストしていませんが、ループが動作している これはdbfiddleです です。

これを行うためのコーシャの方法は、シェルを使用することです。 pgScript全体は、pgAdminの機能が多すぎるようです。 pgScriptはpgAdmin IVにも含まれているようですので、購入者は注意してください。

for i in $(seq 1 100);
  do psql -d database -e 'COPY ...';
end;

Windowsを使用している場合は、次のいずれかを行うことができます

  • powershellでアナログを行い、
  • mingwをインストールする
  • インストール Bash On Windows

そうは言っても、私は@joanoloに同意します。 CSVをデータディレクトリに配置するのはcomically悪いです。通常の状況では、CSVがサーバーに送信されることはありません。彼らはクライアントにとどまります。そして、PSQLの\COPYを使用できます。そうは言っても、ロックダウンされたFTPサーバーがSQLサーバーであり、それが理にかなっている場合もありますが、通常、COPYではなく\COPYを使用し、シェルでこの種のループを実行する必要があります。

PostgreSQL 9.2はDO を追加しました。これはサーバー上でスクリプトを提供するようです。あなたが本当にスクリプトを書きたかったなら。私はあなたがあなたのサーバーでネイティブに実行する何かを書くことができると確信しています。 pg_ls_dir の関数を参照して、dirをループします。

1
Evan Carroll