Bir metin dosyası üzerinden MySQL kayıtları ayıklamak için tasarlanmış php Çözümleyici üzerinde çalışıyorum. Belirli bir satır kayıtları kendileri tarafından takip kayıtları (satırlar) sokulacak gereken hangi tablo karşılık gelen bir dize ile başlayabilir. Kayıtları bir ters eğik çizgi ile ayrılmış ve alanlar (sütunlar) virgül ile ayrılır. Basitlik aşkına, biz Adı, Soyadı ve Meslek varlık alanları ile, bizim veritabanında insanları temsil eden bir tablo olduğunu varsayalım. Aşağıdaki gibi Böylece, dosyanın bir hat olabilir
[İnsanlar] = "\ Han, Solo, Smuggler \ Luke Skywalker, Jedi ..."
Nerede elips (...) ek insanlar olabilir. Bir basit yaklaşım fgets()
dosyasından bir çizgi ayıklamak için kullanmak, ve preg_match()
bu hattan tablo adını, kayıtları ve alanları elde etmek için kullanmak olabilir.
Ancak, diyelim ki biz izlemek için Star Wars karakterleri bir çok şey var olduğunu varsayalım. / Bu satır 200.000 + karakter olmak biter, aslında, pek çok uzun bayt. Böyle bir durumda, veritabanı bilgiler elde etmek için, yukarıdaki yaklaşım biraz yetersiz görünmektedir. Önce, belleğe karakterlerin yüz binlerce okumak ardından back over bu aynı karakterleri regex eşleşmeleri bulmak için okumak zorunda.
Java dosyası aracılığıyla tararken sıralı desenleri maç sağlayan bir dosya kullanılarak inşa Scanner
a> sınıfının String next(String pattern)
yöntemi benzer bir yolu var mı ?
Fikir ((bir dizeye dosyadan okumak için, ve sonra desenleri maç) veya bellekte yedekli metnini saklamak kez aynı metin üzerinden taramak zorunda kalmamasıdır dosyası satır dize ve uyumlu hem de desen). Bu bile performansta önemli bir artış doğuracak? PHP veya Java perde arkasında tam olarak ne yaptığını söylemek zor.
On fgetcsv()
This function makes it very easy to split lines in a file based on some delimiter, and I'm sure it checks for the delimiter character by character as it scans through the file. However, the problem is that there's essentially two delimiters that I'm looking for, and fgetcsv()
only accepts one. For example:
Ben sınırlayıcı olarak, 'kullanabilirsiniz. Ben de bir ters eğik çizgi ile virgül için dosya biçimini değiştirdi sağladı, ben alanların bir diziye bütün çizgi okuyabiliyordu. Sorun, daha sonra, ben ihtiyaç vardır reiterate kayıtları başlangıç ve bitiş yerini belirlemek için ve sql hazırlamak için tüm alanları üzerinde. Ben sınırlayıcı (tek bir ters eğik çizgi, burada kaçtı) gibi '\' kullanmak Benzer şekilde, eğer, o zaman ben alanları ayıklamak ve sql hazırlamak için tüm kayıtları üzerinde reiterate gerekir.
Ne yapmaya çalışıyorum birinde ([tabloismi] gibi ve belki de diğer şeyler,) both virgül ve ters eğik kontrol etmek için maksimum performans için baskın düştü. fgetcsv()
birden ayraçları (veya regex) belirtmek bana izin verilir ya da bana (\ n veya \ n \ r sadece \ için) "satır sonu" olarak değerlendirdiği ne değiştirmek için izin verdiyseniz, o mükemmel bir işe, ama bu mümkün görünmüyor.