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

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

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

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

Java

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

2568閲覧

プロパティファイルで呼び出したKEY値に別のKEY値を指定したい

wanwan_co

総合スコア15

PostgreSQL

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

Java

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2019/01/11 08:53

実装初心者です。始めて質問させていただきます。
至らない点ございましたら申し訳ございません、よろしくお願いよろしくお願いします。

前提・実現したいこと

言語 :java
DB :Postgresql

.shファイルからjavaを実行し、PostgreSQLにてテーブル全データをTSV出力するバッチを作成しております。
PostgresqlのコマンドをプロパティファイルのKEY値に設定し、KEY値を呼び出すことで実行しようと考えています。

設定するKEY値は下記を想定しています。

COPY テーブル名 TO '出力先絶対パス/ファイル名.tsv' WITH CSV NULL AS 'null' DELIMITER E'\t' ;

上記内容をKEY1としたとき、'出力先絶対パス'もKEY2として設定することで、
KEY1を呼び出した後、KEY2も呼び出すことで、KEY2に設定したパスへKEY1に設定したコマンドによりTSVを取得することは可能でしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

プロパティの読み込みと、MessageFormatのプレースホルダを使うことで実現はできます。

java

1import java.io.IOException; 2import java.io.InputStream; 3import java.io.InputStreamReader; 4import java.text.MessageFormat; 5import java.util.Properties; 6 7/** 8 * @author a-pz 9 * 10 */ 11public class MessagePropertiesReader { 12 13 public String getMessage() throws IOException { 14 InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("message.properties"); 15 InputStreamReader reader = new InputStreamReader(inputStream, "utf8"); 16 Properties properties = new Properties(); 17 properties.load(reader); 18 19 String command = properties.getProperty("command"); 20 21 return MessageFormat.format(command, "/usr/local/bin"); 22 } 23}

ただしプロパティファイル中にあるシングルクォートで囲まれた文字列の中身は、そのまま出力してしまいますので、以下のように書き換える必要があります。

properties

1command=COPY テーブル名 TO {0}/ファイル名.tsv WITH CSV NULL AS 'null' DELIMITER E'\t' ;

実行結果は次のようになります。

COPY テーブル名 TO /usr/local/bin/ファイル名.tsv WITH CSV NULL AS null DELIMITER E ;

プレースホルダは複数の変数を指定可能です。

投稿2019/01/12 02:52

A-pZ

総合スコア12011

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

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

A-pZ

2019/01/12 02:53

もし同一プロパティファイルから {0} の中身を指定したいのでしたら、propertiesから別のキーを指定して取得した文字列を格納すれば良いでしょう。
wanwan_co

2019/01/15 02:38 編集

丁寧なご回答ありがとうございます。 同一プロパティファイルから{0}を指定したいため、下記のように実装したいと思います。 もし、下記に誤りがございましたら、ご指摘いただけると幸いです。 【properties】 command=COPY テーブル名 TO {0}/ファイル名.tsv WITH CSV NULL AS 'null' DELIMITER E'\t' ; export_path=/usr/local/bin 【Java】  (略) String command = properties.getProperty("command"); String exportPath = properties.getProperty("export_path"); return MessageFormat.format(command, exportPath );
A-pZ

2019/01/15 11:40

はい、動作としては問題ありません。
wanwan_co

2019/01/17 02:26

時間がたってのレス申し訳ございません。 よろしければご回答、もしくはヒントをいただきたいです。 別部分での質問となりますが、プロパティ読み込み部分でヌルポになりました。 ご教授いただいたソースを参考(流用)実装していましたが、InputStrem定義部分のthis以降は環境に沿って書き換えが必要なのでしょうか? コード: InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("application.properties"); InputStreamReader reader = new InputStreamReader(inputStream, "utf8"); Properties properties = new Properties(); properties.load(reader); 発生エクセプション: Exception in thread "main" java.lang.NullPointerException at java.io.Reader.<init>(Unknown Source) at java.io.InputStreamReader.<init>(Unknown Source) at ~.getMessage(MessagePropertiesReader .java:43) at ~.main(MessagePropertiesReader呼び出し元.java:29) ※クラス名等変更しているため、質問に沿って一部書き換えています
A-pZ

2019/01/20 15:24

私が書いたコードは、Javaのクラスパス以下にある application.properties を参照します。もしクラスパスから参照するのではなく、ファイルのパスを直接指定したい場合はFileで指定して、InputStreamを構築してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問