0

数値を含むファイル内の特定の行を検索し、それらの数値をファイル内で置き換える前に何らかの操作を行う必要があります。たとえば、次のような行があるとします。

normal: { x: 50, y: 50 }

その行を見つけて、両方の数値を 2 で割り、行の数値を置き換えてファイルを更新する必要があります。行を見つけるための正規表現を書くのに問題はなくpreg_replace_callback()、数値を操作するために使用する小さな PHP スクリプトを作成しましたが、数値を置き換えてファイル内のその行だけを更新できるようにする必要があります。bash/sed/awk、Ruby、Python、PHP を喜んで使用しますが、私はそれらの専門家ではありません。

ファイル全体を読み込む必要がreplace_callbacksありますか?その後、ファイルを上書きしますか?

4

3 に答える 3

1

はい。あなたが提案したものが最良の選択肢です。ファイル全体を読み取り、数値を置き換え (既に行っています)、ファイル全体を書き戻します。

非常に巨大なファイルがある場合、メモリに収まらないため、問題が発生する可能性があります。もちろん、ファイルをスキャンして、置き換える必要があるものだけを置き換えることができます。ファイルハンドルをいじり、上書きする必要のあるバイトだけを上書きする (ファイルの残りの部分はそのままにしておく) 場合、次のような状況に陥る可能性があります。

normal: { x: 10, y: 6 }

なる

normal: { x: 5, y: 3 }

したがって、「10」が「5」になるため、バイトが失われます。:-)あなたの例では、代わりにスペースを使用できますが、遭遇するすべての状況でそれが機能するかどうかはわかりません.

要するに、自分で提案したことを実行してください: 読み取り、操作、および書き戻し。

于 2012-07-17T14:36:52.687 に答える
1

preg_replace を使用すると、次のようにカスタム関数でコンテンツを置き換えることができます..:
この例では、値 50 が cnt 関数に送信され、計算され、replace 関数に送り返されます..:

<?php
function cnt($x){
    return $x/2;
}

$txt="normal: { x: 50, y: 50 }";  //Replace this with content of your file
$x=preg_replace("/(normal: { x: )(\d+)(, y: )(\d+)( })/e", "'\\1'.cnt(\\2).'\\3'.cnt(\\4).'\\5'", $txt);
echo $x; //Output:  normal: { x: 25, y: 25 }
?>
于 2012-07-17T14:45:14.697 に答える
0

ファイルを文字列で読み取りたい。preg_match を使用して、操作する数値を取得してから操作します。次に、それらの数値を文字列に戻し、すべてをファイルに書き込みます。

于 2012-07-17T14:30:56.920 に答える