次のようなカスタム形式の大きなテキストファイル(144000行)があります。
xxx
XXXfield1XXX
value1
xxx
xxx
XXXfield2XXX
value2
xxx
xxx
XXXfield3XXX
value3
xxx
ただし、ファイルに構文エラー(おそらくそれ以上)があります(ファイルの合計行数が4に分割できないため)
RegExpだけを使用してエラーの行番号を見つけるにはどうすればよい ですか?
次のようなカスタム形式の大きなテキストファイル(144000行)があります。
xxx
XXXfield1XXX
value1
xxx
xxx
XXXfield2XXX
value2
xxx
xxx
XXXfield3XXX
value3
xxx
ただし、ファイルに構文エラー(おそらくそれ以上)があります(ファイルの合計行数が4に分割できないため)
RegExpだけを使用してエラーの行番号を見つけるにはどうすればよい ですか?
エラーの検出は簡単です..想像してみてください
log.txt
xxx
XXXfield1XXX
value1
xxx
xxx
XXXfield2XXX <----- Note that this field has no value
xxx
xxx
XXXfield3XXX
value3
xxx
value3
xxx
シンプルスキャナー
$fileSource = "log.txt";
$tagRow = "xxx";
$tagField = "XXX";
$rh = fopen($fileSource, 'rb');
if (!$rh) {
trigger_error("Can't Start File Resource");
}
echo "<pre>";
$i = 0;
while ( ! feof($rh) ) {
$l = trim(fgets($rh));
if ((($i % 4) == 0 || ($i % 4) == 3) && $l != $tagRow) {
echo "Row tag error line $i \n";
break;
}
if (($i % 4) == 1 && strpos($l, $tagField) !== 0) {
echo "Missing Field tag line $i \n";
break;
}
if (($i % 4) == 2 && (strpos($l, $tagRow) === 0 || strpos($l, $tagRow) === 0)) {
echo "Fixed Missing Value line $i \n";
break;
}
$i ++;
}
fclose($rh);
出力
Fixed Missing Value line 6
ファイルを一度に1行ずつ読み取り、解析するプログラムを作成します。行が形式と一致しない場合は、エラーを報告して終了します。
各行を読むときは、行番号を追跡してください。%
演算子とswitchステートメントを使用して、行番号に基づいてテストを行います。
switch ($linecount % 4) {
case 0:
$error = (some condition that evaluates the line);
break;
case 1:
$error = (some condition that evaluates the line);
break;
case 2:
$error = (some condition that evaluates the line);
break;
case 3:
$error = (some condition that evaluates the line);
break;
}
if ($error) {
echo 'Error on line ' . $linenum . ': ' . $line;
exit;
}