PHPで動作するCSVファイルのマッチングプログラムを探しています。

マスターファイルとキーファイルを比較し、マッチすればマスターファイルからレコードを抜き出してCSVで出力します。
条件は以下になります。
・マスターファイル、キーファイル共にランダムに登録されています。
・マスターファイルのフィールドにはレコードナンバーがありません。
・抜き出して出力するCSVファイルはマスターレコード順です。
・処理終了後、出力処理件数とマッチしなかったキーを表示します。
・マスター、キー共に、最大データ数は300件未満です。
サンプルデータは以下になります。
http://www.kinkikids.biz/work/master.csv
http://www.kinkikids.biz/work/key.csv

回答の条件
  • 1人2回まで
  • 登録:2008/10/19 19:25:27
  • 終了:2008/10/19 20:45:16

ベストアンサー

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222008/10/19 20:12:40

ポイント100pt

汎用的なプログラムというよりはちょっと書いちゃったほうが早い気がします。

コマンドラインで動作させる形になりますが、いい加減なコードでよければ参考にしてください。

エラーチェックはしてませんが、コマンドラインでスクリプトを実行し、マスターファイル名、キーファイル名、出力ファイル名を引数にして渡すと動作します。

<?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";

?>
id:doumoto

完璧です!ありがとうございました。

2008/10/19 20:43:51

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません