- 締切済み
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について お世話になります。 SQLローダーでCSV取込を行っています。 設定は下記のようになっており、区切り文字はコンマ 囲み文字はダブルコーテーションを指定しています。 LOAD DATA TRUNCATE CONTINUEIF LAST != '"' INTO TABLE WORKTABLE FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( data1 char, data2 char, data3 char ) このように取り込んだところ、下記のような行でエラーが発生しました。 「"data1","data2",""文字列,文字列""」 どうやら元々ダブルコーテーションで囲まれていたデータが CSV出力時にもう1度囲まれた状態のようです。 エラー内容 「TERMINATEDとENCLOSEDフィールドに続く終了記号がありません。」 原因はダブルコートであることはわかっています。 色々試したのですが、うまくいきません。 このデータをうまく取り込む方法はあるのでしょうか よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
LOAD DATA TRUNCATE CONTINUEIF LAST != '"' INTO TABLE WORKTABLE TRAILING NULLCOLS ( data1 char TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', data2 char TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', data3 char TERMINATED BY x'09' ) のように、フィールド毎に、区切りや囲みを指定する事は可能です。 上記の例だと、第3フィールドは「""文字列,文字列""」という内容で登録されます。 ローダーはダブルコーティション以外の囲み文字の場合には、ダブルコーティションを エスケープ文字として使えないので、そのままロードされます。 なので、data3にREPLACE関数記述で、ダブルコーティション2個を1個に置換すれば、 実質的にエスケープ文字として使えるんじゃないですかね。 (「""aa,bb,"",cc,""」→「"aa,bb,",cc,"」のような感じで。)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
パラメータに・・ FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS と書く場合、 各フィールドが、”で囲まれている必要があります。 そして、”を文字として扱いたい場合は、””と書くルールになっています。 ということで、パラメータの記述から見たデータの表現が不適切なので エラーになっています。 第3フィールドの””文字列,文字列””は、どのように扱いたいのでしょう? 「””文字列,文字列””」と登録したいのですか? 「”文字列,文字列”」と登録したいのですか? 「文字列,文字列」と登録したいのですか? たまたま最終フィールドなので、場合によっては何とかなるかも知れません。
- SaKaKashi
- ベストアンサー率24% (755/3136)
ありません。 ENCLOSED BYで指定した"が連続しているかどうかなんてことはSQL*Loaderは判断できませんから。 データが少量なら、手で編集するか、大量なら、元のデータから"を取り除くしか手がありませんね。 無条件に"が2個続くのを1個の"には変換できませんから。
お礼
ご回答ありがとうございます。 何か別の方法を考えてみたいと思います。
補足
ご回答ありがとうございます。 「”文字列,文字列”」と登録したいのです。 色々試行錯誤した結果、「","」を区切り文字に指定、囲み文字は無しで data1 CHAR "SUBSTR(:data1,2)" のような感じで 第1フィールドの最初のダブルコーテションと第3フィールドの最後のダブルコーテーションを 削除することで、とりあえずエラー回避には成功しました。。。 しかしあまりスマートな方法とは思えない為、 何か良い回避方法があれば教えていただけると助かります。