ちょっと先の未来クイズ第4問

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

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

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

パラメータに・・


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

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

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

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

この回答への補足

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

補足日時:2010/08/11 10:21
    • good
    • 0

ありません。


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

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

お礼日時:2010/08/11 10:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報

このQ&Aを見た人がよく見るQ&A