通常、スペースを消したい時とかなら、replaceとかtrimとかで一括で処理してたんだけど、CSVに出力したい時に、複数の処理を纏めるのがスゲェ面倒くさかった。
それがregexp_replaceで一括処理出来るって分かった。
Oracle10g以降で使える
らしいです。
それ以前のバージョンでは使えなさそうなので、replaceとかで頑張るしかなさそう・・・
改行コードがあると何が問題なのか
例えばこんなSQL
select 1 || chr(13) || chr(10) || 2 || chr(13) || chr(10) || 3 from dual;
出力結果はこんな感じになる。
実行結果は改行されていないように見える。
テキストに貼り付けると、改行されてる。
Excelでは、1つのセル内での改行。
PGで画面出力する時も、グリッドのセル内に収まるし、見た目上は改行されていないように見えているので基本的には問題がない。
そう、基本的には。
今回、問題になったのは、CSV出力時。
イメージだけど、
こうなる。
行の途中で改行される・・・
まぁ出力時に「”」で括ってしまえばいいんだけど、出力用の共通関数を使っているので、そこに手を入れるのは避けたい。
どうしよう・・・
って時に見つけた。
実際にregexp_replaceを試してみる
select regexp_replace(1 || chr(13) || chr(10) || 2 || chr(13) || chr(10) || 3 ,'[[:space:]]' ,'' ) from dual; [/
出力結果はこんな感じになる。
実行結果は改行されていないように見える。
テキストに貼り付けると、改行されてない。
Excelでは、1つのセル内での改行されてない。
1つ問題が・・・
select regexp_replace(1 || chr(13) || chr(10) || 2 || chr(13) || chr(10) || 3 ,'[[:space:]]' ,',' ) from dual; [/
先の例では分からないけど、置換用の文字を入れると
こんな風になってしまう・・・
これ、windows環境下で改行が入力されるとCRLF:chr(13)chr(10) の組み合わせで改行コードになるので、それぞれを置換してしまって、「,,」ってなってしまうんだよね。
改行コードのほかにタブ:chr(9)とかも対象。
[[:space:]]が印刷不可能文字を対象とするとの事なので、他にも何か影響があるかもしれない。
最終的にreplaceで落ち着いた
結局、replace(文字列,chr(13) || chr(10),’ ‘)って感じで落ち着きました。
処理したかったのは改行コードだけで、現行システムの稼動は基本的にWindows環境下。
他の印刷不可能文字まで調査する時間は無い。
ってことで、調べたけど使えなかったオチw
[…] […]