OracleのデータをMySQLに移行するためCSVに出力したいが、以下の文字が邪魔(面倒)である。
・改行 (CRLF、LF、CR)
・ダブルクォーテーション
・改行 (CRLF、LF、CR)
・ダブルクォーテーション
調査
面倒なので、これらの文字をOracle上のデータを直接別の文字に置換、
MySQLインポート後に元の文字に戻すことにした。
まずは改行がどの程度存在するか?
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%' || CHR(13) || '%';
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%' || CHR(13) || '%';
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%' || CHR(13) || CHR(10) || '%';
上記の結果、すべて同じ件数であった。
つまり改行コードは CRLF のみ存在する。
改行をどの文字に置換するか?
妥当なのは "\r\n" だろう。
ということで、置換後文字が存在しないことを確認。
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%\r\n%';
存在しなかったのでOK
次にダブルクオーテーション、件数を確認。
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%"%';
存在していた。
何の文字に置換するか?
単純に " の文字コードを表す "CHR(34)" で置換することにする。
置換後文字列が存在しないことを確認。
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%CHR(34)%';
存在しなかったのでOK
ちなみに
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%CHR(13)%';
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%CHR(10)%';
のレコードが存在しなかったので、
改行文字も "\r\n" でなく "CHR(xx)" の形式で置換することにする。
置換実行
・UPDATE xxx SET yyy = REPLACE(yyy, CHR(13), 'CHR(13)') WHERE yyy LIKE '%' || CHR(13) || '%'; CHR(10)、CHR(34)に対しても同じによう実施する。
MySQLインポート後に元の文字に戻すことにした。
まずは改行がどの程度存在するか?
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%' || CHR(13) || '%';
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%' || CHR(13) || '%';
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%' || CHR(13) || CHR(10) || '%';
上記の結果、すべて同じ件数であった。
つまり改行コードは CRLF のみ存在する。
改行をどの文字に置換するか?
妥当なのは "\r\n" だろう。
ということで、置換後文字が存在しないことを確認。
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%\r\n%';
存在しなかったのでOK
次にダブルクオーテーション、件数を確認。
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%"%';
存在していた。
何の文字に置換するか?
単純に " の文字コードを表す "CHR(34)" で置換することにする。
置換後文字列が存在しないことを確認。
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%CHR(34)%';
存在しなかったのでOK
ちなみに
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%CHR(13)%';
・SELECT COUNT(*) FROM xxx WHERE yyy LIKE '%CHR(10)%';
のレコードが存在しなかったので、
改行文字も "\r\n" でなく "CHR(xx)" の形式で置換することにする。
置換実行
・UPDATE xxx SET yyy = REPLACE(yyy, CHR(13), 'CHR(13)') WHERE yyy LIKE '%' || CHR(13) || '%'; CHR(10)、CHR(34)に対しても同じによう実施する。
0 件のコメント:
コメントを投稿