DataSpiderを使ってCSVに存在しないレコードを削除する
アプレッソさんのコミュニティを眺めてたら面白そうな質問があったのでちょっと試してみました。
やりたいこととしては、CSVファイルを読んで、CSVファイル中に存在するデータは残し存在しないデータは削除したいということのようです。
存在するデータは削除だったら非常に簡単なんですが、「存在しない」というのはデータを全部読んでみないとわからないのでちょっと難しいですね。
ということで、フラグを立てるパターンを簡単に実装してみます。
まず、テーブルの状態はこんな感じ。
元データ提供は なんちゃって個人情報 から拝借。
MAILカラムがPrimaryKeyとなるイメージです。
つづいて入力データです。
メールアドレスのみが載ってます。 ここに載っているレコードは削除せず、それ以外のレコードを全部削除したい、ということですね。
まずは全レコードに削除用フラグを立てておきます。 Oracleの場合は真偽値を表す型がないので、numeric(1) で代用しました。
UPDATE “SAMPLE1” SET ON_DELETE = 1
削除フラグに「1」を入れておきます。DataSpiderでは「更新系SQL実行処理」を使います。
これを実行すると ON_DELETE に「1」が入った状態になりました。
次にCSVファイルを読んで、存在するレコードは削除フラグを消します。 今回は削除フラグが「1」のデータは削除、「0」のデータは残すことにしたので、今度は削除フラグを「0」で更新していきます。
CSV読み取りはアドレスだけ
更新系SQL実行処理で ON_DELETE = 0 します。
更新系SQL実行処理の場合、「?{var}」とSQL文に書くことでMapperから値をセットできるようになります。
Mapperの画面は単純にCSVの「アドレス」をSQLの変数「mail」に入れるだけです。
これを実行すると、CSVにある3レコードだけがON_DELETE = 0 になりました。
最後に ON_DELETE = 1 を条件としてDELETE文を発行します。
DELETE FROM “SAMPLE1” WHERE ON_DELETE = 1
実行すると、CSVにある3レコードだけ残して他のレコードはすべて削除されました。
それぞれをつなげるとこういうスクリプトになります。