PHP ile Dosya Hattı yazılsın

5 Cevap php

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.

5 Cevap

Dosya çok büyük değilse, en iyi yolu muhtemelen o {[file(), sizin dize için hatları dizi arama ve bu hat düzenleme ile çizgilerin bir diziye dosyayı okumak olurdu birlikte geri (1)]} dizisi ve fwrite() geri dosyaya.

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.

veya dosya çok büyük değilse:

$sample = file_get_contents('sample');
$parsed =preg_replace('#@parsethis.*#', 'REPLACE TO END OF LINE', $sample);

Gerçi dosyasında bulunmayan Delimiters '#' seçmeniz gerekir.

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