Bir dosyada belirli bir çizgi üzerine yazmak için en iyi yolu nedir? Ben temelde 'parsethis @' dizesi için bir dosya arama ve başka bir şey ile bu satırın kalanını üzerine yazmak istiyorum.
Dosyası (dosya veya böyle bir şey log) gerçekten büyük olduğunu ve iki dosyaları açmak ve esasen Jeremy Ruten dosyalarını kullanarak yerine sistem belleği tarafından önerilen hile yapabilir bellek tüketimi için hız feda etmeye hazırız.
$source='in.txt';
$target='out.txt';
// copy operation
$sh=fopen($source, 'r');
$th=fopen($target, 'w');
while (!feof($sh)) {
$line=fgets($sh);
if (strpos($line, '@parsethis')!==false) {
$line='new line to be inserted' . PHP_EOL;
}
fwrite($th, $line);
}
fclose($sh);
fclose($th);
// delete old source file
unlink($source);
// rename target file to source file
rename($target, $source);
Kişisel Ana problem, yeni satır, eski hattı ile aynı uzunlukta olmayabilir bir gerçektir. Eğer çizginin uzunluğunu değiştirmek gerekiyorsa, değiştirilen satırdan sonra dosyanın en azından tüm rewriting dışında hiçbir yolu yoktur. En kolay yolu yeni, değiştirilmiş bir dosya oluşturun ve sonra orijinal üzerine taşımaktır. Bu şekilde orada okuyucular için her zaman kullanılabilir tam bir dosyadır. Emin sadece bir script seferde dosyasını değiştirerek edilir ve farklı bir dosya üzerinde kilitleme yapmak, dosyayı değiştirmek için gidiyoruz çünkü emin olmak için kilitleme kullanın. (Sürüsünü kontrol).
Eğer yeni hat eski hattı olarak aynı uzunlukta olacağı belli iseniz, (ikinci argüman olarak kullanılması "r +" fopen ()) ve (ftell aramak) kaydetmek için okuma / yazma modunda dosyayı açabilirsiniz Eğer bir satır okumak için fgets () aramadan önce çizgi her saati yerleştirin. Eğer üzerine yazmak istediğiniz satırı bulduğunuzda, () yeni verileri geri hattı ve fwrite başlangıcına gitmek için () fseek kullanabilirsiniz. Her zaman aynı uzunlukta olmak hattı zorlamak için bir yolu, mümkün olan en yüksek uzunluğa alan ped dışarı etmektir.
Ben büyük olasılıkla Jeremy önerilen ne yapardım, ama burada bunu yapmak için alternatif bir yol için başka bir çözümdür. Bu test edilmiş veya kullanılmış ve * nix sistemleri için değil.
$cmd = "grep '@parsethis' " . $filename;
$output = system($cmd, $result);
$lines = explode("\n", $result);
// Read the entire file as a string
// Do a str_repalce for each item in $lines with ""