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

締切り済みの質問

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フィールドに続く終了記号がありません。」

原因はダブルコートであることはわかっています。
色々試したのですが、うまくいきません。
このデータをうまく取り込む方法はあるのでしょうか
よろしくお願いいたします。

投稿日時 - 2010-08-05 16:46:41

QNo.6088980

困ってます

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

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

回答(3)

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,"」のような感じで。)

投稿日時 - 2010-08-12 03:34:55

パラメータに・・
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
と書く場合、
各フィールドが、”で囲まれている必要があります。
そして、”を文字として扱いたい場合は、””と書くルールになっています。
ということで、パラメータの記述から見たデータの表現が不適切なので
エラーになっています。

第3フィールドの””文字列,文字列””は、どのように扱いたいのでしょう?

「””文字列,文字列””」と登録したいのですか?
「”文字列,文字列”」と登録したいのですか?
「文字列,文字列」と登録したいのですか?

たまたま最終フィールドなので、場合によっては何とかなるかも知れません。

投稿日時 - 2010-08-10 19:03:22

補足

ご回答ありがとうございます。
「”文字列,文字列”」と登録したいのです。
色々試行錯誤した結果、「","」を区切り文字に指定、囲み文字は無しで
data1 CHAR "SUBSTR(:data1,2)" のような感じで
第1フィールドの最初のダブルコーテションと第3フィールドの最後のダブルコーテーションを
削除することで、とりあえずエラー回避には成功しました。。。
しかしあまりスマートな方法とは思えない為、
何か良い回避方法があれば教えていただけると助かります。

投稿日時 - 2010-08-11 10:21:31

ANo.1

ありません。
ENCLOSED BYで指定した"が連続しているかどうかなんてことはSQL*Loaderは判断できませんから。
データが少量なら、手で編集するか、大量なら、元のデータから"を取り除くしか手がありませんね。
無条件に"が2個続くのを1個の"には変換できませんから。

投稿日時 - 2010-08-05 18:15:11

お礼

ご回答ありがとうございます。
何か別の方法を考えてみたいと思います。

投稿日時 - 2010-08-11 10:22:32

あなたにオススメの質問