0

次のようなカスタム形式の大きなテキストファイル(144000行)があります。

xxx
XXXfield1XXX
value1
xxx
xxx
XXXfield2XXX
value2
xxx
xxx
XXXfield3XXX
value3
xxx

ただし、ファイルに構文エラー(おそらくそれ以上)があります(ファイルの合計行数が4に分割できないため)

RegExpだけを使用してエラーの行番号を見つけるにはどうすればよい ですか?

4

2 に答える 2

1

エラーの検出は簡単です..想像してみてください

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 
于 2012-11-04T16:25:01.137 に答える
0

ファイルを一度に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;
}
于 2012-11-02T17:07:43.700 に答える