質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

3回答

7065閲覧

PostgreSQLの「COPY TO」で改行含むデータの出力を行いたい。

saki_study111

総合スコア13

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

1グッド

1クリップ

投稿2020/03/12 04:55

編集2020/03/12 23:56

携帯から質問しているためマークダウン記法が使えないないです。申し訳ございません。

PostgreSQLの「COPY TO」を使用して改行含むデータを出力したいです。

【テーブル】
COL1, COL2, COL3
0001, a, あいうえお<CRLF(←↓)>かきくけこ

※COL3のデータには改行コード(CRLF)が含まれています。

【実行コマンド】コマンドプロンプトで実行
psql -h localhost -p 5432 -U postgres -d testdb -c "COPY (SELECT * from test) TO STDOUT WITH encoding 'SJIS' CSV HEADER DELIMITER ',' FORCE QUOTE *;" 1> "c:\work\test.csv"

【出力結果】
col1,col2,col3
"0001","a","あいうえお

かきくけこ"

【問題点】
改行コードが含まれているに余計な改行コードが付与されてしまう。
あいうえお<←><←↓>かきくけこ

この問題を解決するには、テーブルデータの改行はLFのみにする。
もしくは改行コードをLFに置換して出力する。
のどちらかしかできないのでしょうか?

【試した事】
・外部ファイルで読み込む。
SQLファイルの文字コードをSJIS、UTF8にしても同じ事象になりました。

s.k👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

stdoutが入れている様ですので\copyを使って直接ファイルに出力してはどうでしょうか

bat

1psql -h localhost -p 5432 -U postgres -d testdb -c "\COPY (SELECT * from test) TO c:\work\test.csv WITH encoding 'SJIS' CSV HEADER DELIMITER ',' FORCE QUOTE *;"

投稿2020/03/13 02:03

amura

総合スコア333

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saki_study111

2020/03/13 10:55

\COPYを使い出力すると正しく出力されました。 ただエクスポートのSQLが複雑なため一行で書くのが困難であります。 置換するのが良いのでしょうか?
amura

2020/03/13 12:13 編集

-c""の部分をファイルに書いて -f で読み込むのはどうでしょうか -v 置換 もできると思います。 ーーーー訂正 \copyでは-vは使えませんでした。
amura

2020/03/13 12:12 編集

改行コードを入れるのはSTDOUTですのでCOPYでもファイル名にすれば、同じ様にできると思います。''で括る気がしましたが、DBがリモートでは無いのでローカルディレクトリで行けるハズ ーー>訂正 \copyコマンドは -vが使えませんでした(失礼しました)copyは大丈夫です。
amura

2020/03/13 12:31

"COPY (SELECT * from test) TO 'c:\work\test.csv' WITH encoding 'SJIS' CSV HEADER DELIMITER ',' FORCE QUOTE *;"
saki_study111

2020/03/14 08:56

ありがとうございます。 月曜日に試させてもらいます!
sazi

2020/03/14 09:38

@amuraさん > 改行コードを入れるのはSTDOUT 上記部分の詳細をご教示頂けないでしょうか。
amura

2020/03/14 09:59

copyのマニュアルで「Microsoft Windowsで稼働するサーバの場合は、サーバ上のファイルへのCOPYの場合にのみ復帰/改行("\r\n")を出力します。」と有り、行の改行とは思いましたが、実際にwindowsで行った際に内部改行にも付いていました。
saki_study111

2020/03/15 23:29

今試しましたところ思った通りに動作しました。 ありがとうございます。 STDOUT 標準出力について勉強します。
guest

0

LFCRLFCRLFに置換すれば良いかと思います。

SQL

1update test set col3=replace(col3, chr(10) || chr(13) || chr(10), chr(13) || chr(10))

投稿2020/03/12 09:54

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saki_study111

2020/03/12 12:48

単純にSELECT文を実行すると正しく〈CRLF〉だけが出力されます。 COPY TOで実行すると〈CRCRLF〉で出力されてしまいます。 SELECTする前にUPDATEして置換するか、SELECT時に置換するしかなさそうですか?
sazi

2020/03/12 13:44

select とcopy toで項目の内容が変わったりするというのは記憶にないですね。 リダイレクトせずにファイルを直接指定するとどうなるでしょうか?
saki_study111

2020/03/12 23:46

selectとCOPY TOでは値が変わるというのは初めてですか… ファイル直接指定はSQLをファイルにして-fで読み込むって事でよろしいでしょうか?
saki_study111

2020/03/12 23:55

SQLファイルを読み込む方式にしても同じ現象になります。 また、そのSQLファイルの文字コードをSJIS、UTF8のどちらも同じ事象になりました。
sazi

2020/03/13 02:40

標準出力ではなくファイルに出力です
saki_study111

2020/03/13 10:55

\COPYを使い出力すると正しく出力されました。 ただエクスポートのSQLが複雑なため一行で書くのが困難であります。
sazi

2020/03/13 12:02 編集

それは、-fオプションで良いと思いますけど。 後は、selectの部分をストアドにしたらどうでしょう。結構短く出来ると思いますが
saki_study111

2020/03/14 09:00

/COPYでストアドを呼び出すって事でしょうか?
sazi

2020/03/14 09:11

ストアドは面倒なので-fで良いと思います。
sazi

2020/03/14 09:36

ただ、\copyは内部的に標準出力を経由しているだけなので、\copyで上手く行ったなら、改行の問題が標準出力の問題とは考えにくいですが。
guest

0

改行コードを含むカラムがわかっているのであれば、
改行コードをなにか別の記号に置き換えるなどすればよいのではないかと。

【PostgreSQL-0012】改行コードを取り除く方法 - OSS ERP Compiere Distribution Lab

投稿2020/03/12 07:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問