マスターファイルとキーファイルを比較し、マッチすればマスターファイルからレコードを抜き出してCSVで出力します。
条件は以下になります。
・マスターファイル、キーファイル共にランダムに登録されています。
・マスターファイルのフィールドにはレコードナンバーがありません。
・抜き出して出力するCSVファイルはマスターレコード順です。
・処理終了後、出力処理件数とマッチしなかったキーを表示します。
・マスター、キー共に、最大データ数は300件未満です。
サンプルデータは以下になります。
http://www.kinkikids.biz/work/master.csv
http://www.kinkikids.biz/work/key.csv
汎用的なプログラムというよりはちょっと書いちゃったほうが早い気がします。
コマンドラインで動作させる形になりますが、いい加減なコードでよければ参考にしてください。
エラーチェックはしてませんが、コマンドラインでスクリプトを実行し、マスターファイル名、キーファイル名、出力ファイル名を引数にして渡すと動作します。
<?php $masterFile = $argv[1]; $keyFile = $argv[2]; $outputFile = $argv[3]; $items = file($masterFile, FILE_IGNORE_NEW_LINES | FILE_BINARY); $keys = file($keyFile, FILE_IGNORE_NEW_LINES | FILE_BINARY); $checkList = array(); for ($i = 0; $i < count($keys); ++$i) { $checkList[] = false; $keys[$i] = trim($keys[$i]); } $fout = fopen($outputFile, "wb"); $count = 0; for ($i = 1; $i < count($items); ++$i) { $item = $items[$i]; $elements = explode(',', $item); $index = array_search($elements[0], $keys); if ($index !== FALSE) { fwrite($fout, $items[$i] . "\n"); ++$count; $checkList[$index] = true; } } fclose($fout); $unmatched = array(); for ($i = 0; $i < count($keys); ++$i) { if (!$checkList[$i]) { $unmatched[] = $keys[$i]; } } print "Matched : $count\n"; print "Unmacked Keys : " . implode(',', $unmatched) . "\n"; ?>
完璧です!ありがとうございました。