bulmak ve PHP kullanarak bir düz dosyasındaki değerleri değiştirin

2 Cevap php

Ben bu zaten bir soru olduğunu sanırsın, ama ben bulamıyorum. Belki de çözüm çok kolay ... Neyse, ben bir düz bir dosya varsa ve kullanıcı adına göre değerlerini değiştirmek izin vermek istiyorum. Zaten newValue ve newName ile AJAX çağrı göndermek için jQuery kullanarak, fopen('a') modunu kullanarak yeni adı + değer çiftlerini yaratan dizildi ettik. Ama içerik bu gibi görünüyor söylüyorlar:

host|http:www.stackoverflow.com
folder|/questions/
folder2|/users/

Ve şimdi ben folder değerini değiştirmek istiyorum. Bu yüzden oldName olarak folder göndermek ve /tags/ newValue şeklinde olacak. Değeri üzerine yazmak için en iyi yolu nedir? Listede sırası önemli değildir, ve adı her zaman bir | (boru), ardından sola, değer ve ardından bir new-line olacak.

Benim ilk düşünce, listesini okumak bir dizide saklamak, oldName, sonra ona ait olduğu [1] değiştirmek için tüm [0] 's aramak oldu , ve sonra tekrar bir dosyaya yazmak. Ama bu çevrede daha iyi bir yolu var olduğunu hissediyorum? Herhangi bir fikir? Belki regex?

2 Cevap

Çok kolay yolu tüm dosya üzerinde str_replace () kullanmak olacaktır:

// read the file
$file = file_get_contents('filename.csv');
// replace the data
$file = str_replace('folder|oldValue', 'folder|newValue', $file);
// write the file
file_put_contents('filename.csv', $file);

Yani bir seferde yalnızca bir kullanıcı dosya olarak çalışması gerekir. Ancak bir veritabanı her zaman daha iyi bir fikir. CSV gerekiyorsa, sadece bir CSV dosyası daha CSV komut için ek bir DB var ve bu iyi.

APC gibi bir PHP özelliğini kullanarak bellekte listesini tutmak ve diske sık sık bunu yazabilirsiniz. Bellekte olmadığında bu şekilde sadece bunu okuduğunuz.

Bir CSV bu bilgiyi depolamak odaklı performans olmak istiyorsanız muhtemelen başlamak için iyi değil. Eğer gerçek bir RDMS (MySQL) kullanmak istemiyorsanız, o zaman ben SQLite kullanarak öneririm. Size bu durumda (GÜNCELLEME) için aradığınız tüm özellikleri sağlar ve o sabitdisk üzerinde sadece bir dosya ve eşzamanlılık olmadığını anlamda bir CSV tam olarak aynı davranır.

Bu bir seçenek değilse başka bir yol sed & gibi kabuk düzeyi komutlarını kullanmak için awk inline düzenli ifade değişiklikleri yapmak. Son olarak, (s///) bunun üzerine bir kötü regex ayarı gerçekleştirerek, bir dizeye bütün dosya okuma ve daha sonra işe tekrar dışarı yazma