こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PLSQLで文字列置換

よろしくお願いします。

PLSQLで可変長のCSVファイルを読み込み、ある特殊文字があった場合、その
特殊文字が含まれている項目ごとNULLにし、またCSVファイルを出力する。

というプログラムを作りたいのですが、CSVファイルの読込み、書き出しのやり方
は判ったのですが、文字列置換がどうすればいいかわかりません。
またファイルはマルチレイアウトで、カラム数とも不定です。

例)
入力ファイル: A,B,C,D,ABCDEFG,FF,GG

となっている場合、'E'という文字があるカラムはNULLで出力する というときに

出力ファイル: A,B,C,D,,FF,GG

としたいのです。



ご教授下さい。

投稿日時 - 2005-08-18 18:55:54

QNo.1588524

困ってます

質問者が選んだベストアンサー

こんにちわ。

> 文字列置換がどうすればいいかわかりません。
decode(instr(データ, '特殊文字'), 0, データ, NULL)
でどうでしょう?

投稿日時 - 2005-08-18 21:08:19

お礼

お返事ありがとうございます。

特殊文字が複数ある場合はどうすればよいでしょうか?
またデータは [,]と[,]の間の文字としたいのですが
どう判断させればよろしいでしょうか?

投稿日時 - 2005-08-19 11:04:38

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

この手の作業はPL/SQLが苦手とする分野ですね。
Javaやほかのスクリプト言語(Perlなど)でプログラムした方が効率的だと思います。(PL/SQLで行わなければいけない理由が特に無い場合)
開発の制約でPL/SQLにこだわるのであれば、参考URLが役に立つと思います。

参考URL:http://www.oracle.com/technology/oramag/code/tips2004/080904.html

投稿日時 - 2005-08-22 22:48:57

お礼

お返事ありがとうございます。
PLSQLで作成しなければならず、いろいろ困っていました。
参考のURL情報大変、参考になります。
改良してなんとかやってみようと思います。
ありがとうございました。

投稿日時 - 2005-08-24 11:07:39

ANo.3

こんにちわ。

> decode(instr(データ,'特殊文字1')+instr(データ,'特殊文字2')+・・・
> instr(データ,'特殊文字N'),0,データ,null)
以下のように演算結果の符号部分のみdecode して下さい。
decode(sign(instr(...) + instr(...) + ...), 0, データ, NULL)

> 「,」で区切られている間をデータとみなす方法がInstrとSUBSTRの組み合わせ
> でできるとの事ですが、どのようにすればよいのでしょうか。
こんな感じでしょうか?
substr(データ, instr(データ, ',') + 1, instr(データ, ',', 1, 2) - instr(データ, ',')-1)
→ 最初のカンマと2番目のカンマの間の文字をデータとして取り出します。
  最初のカンマの次の文字から、2番目のカンマまでの文字数 - 最初のカンマ
  までの文字数 -1文字を、間のデータと見なしています。
  カンマの数が2個より少なかった場合の事は考慮していませんので、注意して下さい。

投稿日時 - 2005-08-22 22:05:06

お礼

ありがとうございます。
SUBSTRのほうはなんとなくわかりました。
もうちょっと頑張ってみます。

投稿日時 - 2005-08-24 11:05:30

ANo.2

こんにちわ。
#1 のmuyoshid です。

> 特殊文字が複数ある場合はどうすればよいでしょうか?
特殊文字の数分instr の結果を足し算すればできますょ。
instr は、指定した文字が表れた場所を返してくれるので、
instr(データ, '特殊文字1') + instr(データ, '特殊文字2') +
... + instr(データ, '特殊文字n') を計算します。
計算結果の符合 (SIGN) をdecode すれば、
0:特殊文字無し
1:特殊文字有り
となります。
Oracle9i であればcase 文が使えますが、この方法だとバージョン
に依存せず使用できます。

> またデータは [,]と[,]の間の文字としたいのですが
これは、instr とsubstr を組合せればカンマの中を取り出す事ができます。

投稿日時 - 2005-08-20 04:58:30

補足

ありがとうございます。
decode(instr(データ,'特殊文字1')+instr(データ,'特殊文字2')+・・・
instr(データ,'特殊文字N'),0,データ,null)
ということですよね。
よくわかりました。

「,」で区切られている間をデータとみなす方法がInstrとSUBSTRの組み合わせ
でできるとの事ですが、どのようにすればよいのでしょうか。
なにからなにまですみません。
お願い致します。

投稿日時 - 2005-08-22 11:51:24

あなたにオススメの質問