PostgreSQLの出力をシェルからcsvファイルにエクスポートする際に問題があります。
私のSQLスクリプトはscript.sql
と呼ばれます。
シェルで次のコマンドを入力しました。
psql congress -af script.sql &> filename.csv
しかし、filename.csv
ファイルを開くと、すべての列の値がExcel csvの1つの列に絞り込まれます(添付のスクリーンショットを参照)。
それから私は別の方法を試しました。 script.sql
を次のように編集しました:
Copy (Select * From ...) To '/tmp/filename.csv' With CSV;
次に、データベースdbname
内のシェルで次のコマンドを入力しました。
\i script.sql
出力は次のとおりです。
COPY 162
さて、出力クエリには162行あります。
したがって、出力テーブルの162行がシェルにコピーされました。それらをcsvファイルに貼り付けるまたは移動するにはどうすればよいですか?
または、filename.csv(スクリーンショットが添付されています)を使用する場合、csv/Excelファイルの形式を修正するにはどうすればよいですか?
最新の構文:
COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);
したがって、出力テーブルの162行がシェルにコピーされました。それらをcsvファイルに貼り付けるまたは移動するにはどうすればよいですか?
結果はCSVファイルです。一致する区切り文字を使用して、スプレッドシートプログラムで開きます。 ドキュメントごと:
デフォルトは、テキスト形式のタブ文字、CSV形式のカンマです。
Patrick commented と同様に、対応するpsqlメタコマンド\copy
同様の方法で。クライアントにローカルなファイルを書き込み(および読み取り)、スーパーユーザー特権を必要としません。
これらの関連する回答の詳細:
少し接線を外して、別の方法もあります。
Windowsバッチスクリプトで次を使用します。-
psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o "%dumpDir%\tables.txt" -A -c "SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema = '%qSchema%';"
秘Theは-Aオプションを覚えておくことです。データの空白埋め込みを抑制します。
これは、postgressを実行しているアカウントがスケジュールされたバッチファイルを実行しているアカウントと同じ権限を持っていない場合に、上記のCOPYコマンドからの権限エラーを回避するためです。
これにより、特定のスキーマ内のテーブルのリストが取得され、次のような結果が得られます。
myschema | mytable1
myschema | mytable2
次に、FORバッチコマンドを使用して各行を処理します。本当にCSVファイルが必要な場合、あなたがする必要があるのはこれだけでしょう:-
ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv
おそらく最も効率的なメカニズムではありませんが、少数の出力行で正常に機能します。
最初に接続情報を〜/ .pgpassにコピーし、
cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz