[Oracle]regexp_replaceで、改行コード・タブとかのCSV出力時に邪魔になるものを消す

投稿日:

通常、スペースを消したい時とかなら、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







-ORACLE, 開発メモ
-,


関連記事

ダイナミックディスクのクローン作成に失敗したから、結局、OSのクリーンインストールをせざるを得なかった。

SSDへの移行失敗しました。 無料で使えるEaseUS Todo BackUp のフリー版を使ったけど、クローンが作成できなかった・・・ コピー後、起動しようとしても、お馴染みのOSディスクが無いぜ? …

[ORACLE]ORA-00918:列の定義が未確定です・・・のエラーにならなかった

なんでエラーになるものをマージしてるんだ? と、怒られました。 一瞬、理解が出来ず・・・ で、エラーを再現してもらう・・・と。 あっさり発生。 早く修正しろって突っ返されました。 頭には「?」しか浮か …

[ORACLE]多分、例外的なora-00911:文字が無効ですエラーの解決方法

多分、このエラーを目にする機会はそれなりにあって、大体の対処法はググればすぐに見つかると思う。 例えば、 SQL実行時にはOKなのに、C#のOracleDbAccess実行時にエラーになる 全角スペー …

C#で発生するORA-01036:illegal variable name/numberのエラーの解決法

毎度毎度、原因の分かりづらいエラーにハマりますw 今回は、「ORA-01036:illegal variable name/number」。 日本語に直訳された内容だと「変数の名前/数が無効です」とな …

Oracle11gでパスワードの有効期限を変更する

先日のOra-28001ですが、他のユーザーも同様になってましたw 当然ですね・・・ 日本の中心付近で仕様変更と闘うSE日記Oracleで「Ora-28001:the password has exp …


カテゴリー