PHP ile Metin Dosyadan Veri Aralığı Sil

6 Cevap php

Ben PHP kullanarak bir metin dosyasından veri aralığını silmek istiyorum. Adlı dosya aşağıdakileri içerir varsayalım:

Hello, World!

Ben karakteri 2 karakteri 7 için her şeyi silmek istiyorum. Ben bunu yapmam gerek gerçek dosya çok büyük, bu yüzden verilerin sadece küçük, verilen aralığını silmek amacıyla büyük dosya okumak zorunda istemiyorum . Verilen aralığında bulunan veriler bilinmemektedir, bu nedenle str_replace veya preg_replace çözümler zaten işe yaramaz.

Teşekkürler!

6 Cevap

Senin çocuklar tavsiye aldı, artı biraz beyin fırtınası yaptım ve benim soruna bir çözüm bulundu. Temelde Ignacio'nun öneri aldı:

Sen deliği doldurmak için aşağı taşımak için öbek aşağıdaki her şeyi okumak gerekir. Başka bir dosyaya ilgili veri kopyalama yapmak için kolay bir yoldur.

Yerine geçici bir dosyaya veri taşıma Ama, ben sadece her parça okuyun ve sonra hemen fseek () ve delik doldurmak için kullanılır fwrite () ile geriye dosya işaretçisi taşındı. Sonra ftruncate ile doğru uzunlukta () için dosya kesildi.

Yine, teşekkürler önerileriniz için herkes!

Nedense bir dosyayı kullanmak zorunda, ve bu büyük bir dosya ise, sen (anda bir çizgi gibi) küçük parçalar okumak ve sürekli bir geçici dosyaya dışarıda tutmak istediğiniz verileri yazabilirsiniz. Bu bellek gereksinimleri aşağı kesecek.

Bir dosyanın ortasında bir yığın kaldırmak için hiçbir yolu yoktur. Sen deliği doldurmak için aşağı taşımak için öbek aşağıdaki her şeyi okumak gerekir. Başka bir dosyaya ilgili veri kopyalama yapmak için kolay bir yoldur.

Sen istemiyorum ama bunu yapmak zorunda. Okuyun ve tüm dosyayı yeniden. Herkes, bunun için bir düz dosya bir veritabanı kullanmak bu yüzden

Ben hala ideal emin değilim ancak burada benim orijinal cevap daha iyi bir çözüm, bu.

Sen okumak için dosyayı açın ve parçaları okumak, size yazmak için açtın ikinci bir dosya içine okumak ne düşüyor olabilir. Sonra sadece "silmek" isteyen konum kısmını atlamak.

Doğal sonunda size orijinal üzerinde geçici dosyayı kopyalamak istiyorum.

Edit:

Başka yansıması üzerine, ben bu aslında muhtemelen en yararlı cevap hissediyorum (/ sürece birisi daha iyi bir fikir kadar), ancak kredi ilk aynı sonuca varılması için "gnud" gitmek gerekir.

Aklıma basit yolu, bir dize olarak tüm dosya okumak ve bir segment kaldırmak için array_splice string_splice kullanmaktır.

Edit:
Excuse me, I didn't mean array_splice, I meant string_splice, which is a custom function I made for my own use. It's something like this (I don't have it handy at the moment):

function string_splice($string, $start, $length, $replace) {
    $string = substr($string, 0, $start).$replace.substr($string,$length);
}

Edit:

This is NOT the ideal solution; please see the comments below. Bu bir dizeye çok büyük bir dosyayı okumak için kötü bir fikirdir; bellek tüketime ek olarak, bu kadar büyük bir ipe yapan çok verimsizdir. Daha iyi bir çözüm gnud tarafından önerilen olmasıdır. Teşekkürler.