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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1339閲覧

テーブルデータをCSVに出力したい

inu_inu

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/18 01:44

java初心者です、始めて質問させていただきます。
不備があったらご指摘ください。

前提・実現したいこと

テーブルの全データをCSVに出力したいです。
javaを使ってPostgreSQLにアクセスしようと思っています。

発生している問題

設計の段階で、どのようにすればいいかわからない状態です。

①複数行あるテーブルのデータをすべて抽出する方法
②抽出したデータをCSV形式で出力する方法
③CSV出力時に、区切り文字はタブ・NULLはnullという文字に変換・空文字はそのまま、という条件で出す方法

の実装のヒントでもいただければ嬉しいです。
拙い質問の仕方で申し訳ございません。

こうかな?と思っていること

DaoにSQLを書き出して、テーブルごとに対応したEntityに入れ込んで、コントローラ(ロジック?)からEntityの要素をcsvに書き出すという流れだろうな、と思っています。

①はListを使ってぐるぐる回して抽出するのかなと思っており、現在調べてみているところです。
②はあまりピンと来ていません、調べてもコンソールを使用した方法ばかり出てきます。
③は②が分かればおのずとわかるかなと思っています。

拙い質問の仕方で申し訳ございません。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

postgresならCOPYコマンドがあるので、以下の様な発行となるように編集して、insertやupdateなどの更新系のSQLと同様に発行すれば良いかと。

SQL

1COPY select colalesce(カラム,'Null'),・・・ TO ファイル名 with(オプション)

追記

Nullを示す文字列指定するオプションがありました。
以下は'Null'をNullとして扱います。

SQL

1with(NULL 'Null')

投稿2019/01/18 02:10

編集2019/01/18 09:07
sazi

総合スコア25195

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

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

inu_inu

2019/01/18 02:27

ご回答ありがとうございます。 COPYコマンドについて、質問させていただく前に見つけて試したのですが、"スーパーユーザでなければ使用できません"という旨のエラーが出たため、質問した次第でした。(試したところに記載するべきでした) COPYコマンドを利用してうまく出力する方法などあれば、別途ご教授願いたいです。
sazi

2019/01/18 08:14

スパーユーザーでログインするか、ログインしているユーザーに必要なテーブルの権限を与えましょう。 出力するファイルに関する権限なら、権限のある場所に出力するようにする。
inu_inu

2019/01/18 08:20

確認したところ、使用していたユーザはスーパーユーザでした。 ご提示していただいたコマンドを (別途オプションなどつけていますが) TeraTermからpsql接続したうえで実行しましたが、"スーパーユーザ~"のエラー構文が出力されました。 コマンドの頭に"\"を付与すると無事に動きましたが、実行環境の問題でしょうか?
sazi

2019/01/18 08:23

psqlからだとコマンドは\copyです。 javaからじゃないんですか?
inu_inu

2019/01/18 08:29

説明が不足しておりました。 javaで動作しなかったため、コマンド自体が正しいかの確認のためにpsqlから実行してみた結果でした。 javaで実行する場合、copyManagerを利用して上記コマンドを実行しようと考えていますが、psqlで実行できたユーザを使用してもうまく出力できていない状況です。copyManagerの使い方が誤っているか、Eclipse上で実行しているため環境の問題かな…と考えていたところです。 本質問の範囲から超えてしまうかと思い、省いてしまいました。失礼しました。
sazi

2019/01/18 09:07

了解しました。`Null'について追記しました。
inu_inu

2019/01/18 09:36

回答の追記ありがとうございます! ちなみに、現在下記のようなコマンドを実行しています。 COPY テーブル名 TO '/パス/ファイル名.tsv' WITH CSV HEADER NULL AS 'null' DELIMITER E'\t'; psqlでの実行にはなりますが、想定しているcsv出力を行えました。 javaからの実行に関しては依然うまくいっていませんが、もう少し考えてみて、うまくいかない場合は別途質問を挙げるようにします。 非常に助かりました、ありがとうございました。
sazi

2019/01/18 10:17

蛇足ですが、オプションのWITHはwith()で記述すると、()内のオプションは,で区切ることができて可読性が向上します。
inu_inu

2019/01/20 23:47

なるほど、確かに区別がつきやすくて読みやすいです! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問