メディアフォース 開発者ブログ

株式会社メディアフォースの開発者による非公式ブログです。

DataSpiderを使ってCSVに存在しないレコードを削除する

アプレッソさんのコミュニティを眺めてたら面白そうな質問があったのでちょっと試してみました。

dstn.appresso.com

やりたいこととしては、CSVファイルを読んで、CSVファイル中に存在するデータは残し存在しないデータは削除したいということのようです。

存在するデータは削除だったら非常に簡単なんですが、「存在しない」というのはデータを全部読んでみないとわからないのでちょっと難しいですね。

ということで、フラグを立てるパターンを簡単に実装してみます。

まず、テーブルの状態はこんな感じ。

f:id:mf_sol_eai:20170629112608p:plain 元データ提供は なんちゃって個人情報 から拝借。

MAILカラムがPrimaryKeyとなるイメージです。

つづいて入力データです。

f:id:mf_sol_eai:20170629122356p:plain

メールアドレスのみが載ってます。 ここに載っているレコードは削除せず、それ以外のレコードを全部削除したい、ということですね。

まずは全レコードに削除用フラグを立てておきます。 Oracleの場合は真偽値を表す型がないので、numeric(1) で代用しました。

UPDATE “SAMPLE1” SET ON_DELETE = 1

削除フラグに「1」を入れておきます。DataSpiderでは「更新系SQL実行処理」を使います。

f:id:mf_sol_eai:20170629122715p:plain

これを実行すると ON_DELETE に「1」が入った状態になりました。

f:id:mf_sol_eai:20170629122821p:plain

次にCSVファイルを読んで、存在するレコードは削除フラグを消します。 今回は削除フラグが「1」のデータは削除、「0」のデータは残すことにしたので、今度は削除フラグを「0」で更新していきます。

CSV読み取りはアドレスだけ

f:id:mf_sol_eai:20170629122957p:plain

更新系SQL実行処理で ON_DELETE = 0 します。

f:id:mf_sol_eai:20170629123043p:plain

更新系SQL実行処理の場合、「?{var}」とSQL文に書くことでMapperから値をセットできるようになります。

Mapperの画面は単純にCSVの「アドレス」をSQLの変数「mail」に入れるだけです。

f:id:mf_sol_eai:20170629123208p:plain

これを実行すると、CSVにある3レコードだけがON_DELETE = 0 になりました。

f:id:mf_sol_eai:20170629123301p:plain

最後に ON_DELETE = 1 を条件としてDELETE文を発行します。

DELETE FROM “SAMPLE1” WHERE ON_DELETE = 1

実行すると、CSVにある3レコードだけ残して他のレコードはすべて削除されました。

f:id:mf_sol_eai:20170629123448p:plain

それぞれをつなげるとこういうスクリプトになります。

f:id:mf_sol_eai:20170629123639p:plain