Bu yazıda MySQL veritabanına text dosyasındaki düzenli veriyi nasıl kaydedeceğinizi göreceksiniz. Bu yazıda standart fopen fonksiyonu yerine PHP 5.1+ ile gelen Standart PHP Library (SPL) arayüzünü kullanan SplFileObject sınıfını kullanacağız.
Uygulama için oluşturduğum veritabanı aşağıdaki gibidir. Tablonun adını musteri olarak aşağıdaki gibi oluşturdum.
Yukarıdaki veritabanına kaydedilecek text veriside aşağıdaki gibidir. Dosyasının adını veri.txt olarak berirledim.
1 2 3 4 5 | Ahmet;Can;1980-2-25 Murat;Ek;1975-12-25 Nejla;Bildi;1997-10-5 |
Aşağıdaki kodda; SplFileObject, metin dosyasının sonuna ulaşana kadar metin satırını satır satır okur. Her satırda kişinin adı, soyadı ve doğum tarihi bulunur. Satırı okuduktan sonra, bir işlemdeki değişkenlerin listesine değer atamak için list() işlevini kullanırız.
1 2 3 4 5 6 7 8 9 | $dosya=new SplFileObject('veri.txt'); while(!$dosya->eof()) { $satir=$dosya->fgets(); list($isim,$soyad,$dtarih,$sinif)=explode(';',$satir); /*veritabanı*/ } |
PDO nesnesini oluşturup, ilgili bağlantı ve tablo isimlerini doğru şekilde yaptıktan sonra kayıt ekleme işlemini aşağıdaki kod benzer bir şekilde yaparız.
Benim oluşturduğum örnekte veritabanı adı ornek ve tablo adı musteridir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php /* Sürücü isteğiyle bir ODBC veritabanına bağlanalım */ $dsn = 'mysql:dbname=ornek;host=127.0.0.1'; $user = 'root'; $password = ''; try { $baglan = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Bağlantı kurulamadı: ' . $e->getMessage(); } $dosya=new SplFileObject('veri.txt'); while(!$dosya->eof()) { $satir=$dosya->fgets(); list($isim,$soyad,$dtarih,$sinif)=explode(';',$satir); $sth= $baglan->prepare('INSERT INTO ogrenci values(NULL,?,?,?,?)'); $sth->bindValue(1,$isim,PDO::PARAM_STR); $sth->bindValue(2,$soyad,PDO::PARAM_STR); $sth->bindValue(3,$dtarih,PDO::PARAM_STR); $sth->bindValue(4,$sinif,PDO::PARAM_INT); $sth->execute(); } |
Öncelikle emeğinize sağlık hocam.
Bu konu ile ilgili bir sorum olacaktı. Yerli ve yabancı bir çok siteden araştırdım ama herhangi sonuç alamadım.
Sorum; txt dosyasında sütunları birbirinden ayıran noktalı virgül ya da başka bir işaret yoksa verileri sütun genişliğine göre kaydedebilir miyiz?
Örneğin Txt dosya düzenimiz aşağıdaki gibi olsun.
ADNAN DEMİRKOL AAAAAAAAAABBBBBBBBB
ADEM ÇETİN AAAAAAAAAABBBBBBBBB
1. sütun genişliğimiz 15
2. sütun genişliğimi 10
3. sütun genişiliğimiz 9
bu durumda ilk 15 karakter 1. sütuna, sonraki 10 karakteri 2. sütuna, geriye kalan 9 karakteri de 3. sütuna yazdırmak istiyorum.
Bu konuda yardımcı olursanız çok sevinirim. iyi çalışmalar
fgets fonksiyonu kullanarak satır satır okuma yapabilirsin. Bu yöntem işini görecektir.
Cevabınız için teşekkür ediyorum.
satır satır okuma ile ilgili örnekleri inceledim o konuda bir sorun yok. benim sorum sütunlarla ilgili. sütun sütun okuyarak kaydetmek istiyorum. fgets fonksiyonu ile yapılıyorsa da ben bilmiyorum. İlk mesajda verdiğim örnekte de gösterdiğim gibi Sütunun genişlik değeri kadar karakter okumasını istiyorum.
str_split fonksiyonu ile belirli uzunluktaki veriyi bölebilirsin. Ama bunu da bulmuşsundur.
Bu fonksiyonu işine yararsa Türkçe desteği için mb_str_split kullanabilirsin. Umarım faydalı olur.
Değerli Hocam ilginiz için teşekkür ediyorum.
önerdiğiniz str_split fonksiyonunun yanısıra substr fonksiyonunu da kullandım. Bu fonksiyonlarla her sütun için ayrı ayrı değer girerek veritabanına kayıt ekleyebiliyorum. Fakat benim yapmak istediğim bunun ötesi. her sütun için ayrı ayrı değer girmek yerine sütun genişliğini bir fonksiyonla alıp txt verilerini bu sütun genişliğine göre ayırmak ve Veritabanına eklemek istiyorum.
Umarım doğru anlatabilmişimdir.
bu arada belirtmeliyim ki php’de çok yeniyim. Amacım araştırıp öğrenmek.
PHP ile her istediğin işlem için birden fazla yöntem bulursun ama burada senin aklındaki algoritmaya uyup uymaması önemli. Öncelikle sorunu çözmek için izlemen gereken adımları bir kağıda dök ve elde olan fonksiyonlar ile bu alanların hangilerini yapabilirsin incele. Mutlaka sorunu çözersin.
Not:bir string ifadenin uzunluğunu almak için strlen kullanılır. Belki faydası olur.
Sayın Admin
önerilerinizi dikkate alarak adım adım sona yaklaşıyorum.
Tamamı bittikten sonra sizinle de paylaşacağım.
son bir şey kaldı.
aşağıdaki fonksiyonu kullanarak txt dosyasındaki verileri sütun genişliklerine göre parçaladıktan sonra ekrana yazdırıyorum. Fakat Türkçe karakter sorunu yaşıyorum. substr() yerine mb_substr() fonksiyonunu da kullandığımda hata alıyorum. bu sorunu nasıl aşabilirim?
function txtBol($metin, $genislik){
$parcala=array();
foreach ($genislik as $sutunadi => $lenght)
{
$parcala[$sutunadi] = substr($metin, 0, $lenght);
$metin = substr($metin, $lenght);
}
return $parcala;
}
Türkçe dili için mutlaka mb_substr kullanmalısın. Daha öncede belirttiğim bir fonksiyon vardı onu da kullanmalısın. mb_strlen() kullanarak gerçek uzunluk üzerinde işlem yapabilirsin.
Yazdığın örnek uygulamayı inceleyip müsait zamanda Kod örneği atmaya çalışırım. (Fırsat olursa)
hocam bendeki txt dosyanın içerigi her satır aynı uzunlukta degil ve tek bir dosyayı degil hergün her yeni birkaç txt geldiginde veritabanına kaydetmek istiyorum onu nasıl yapabiliriz REP00_B_350_SUM0_231103_1136.txt dosyamın içerigi aşagıdaki gibi
001;B 350
002;0
003;0
004;01:00:00 01-01-1970
005;03:25:06 03-11-2023
006;11:36:54 03-11-2023
007;–;–;– ———-
008
009
010;SIRMA
011;1303770
012;
013;0
014;0
015;0
016;0
017;0
018;0
019;0
020;0
021;0
022;0
023;0
024;0
025;0
026;0
027;0
028;0 ;0
029;0 ;0
030;0 ;0
031;0
032;0
033;0 ;0
034;0 ;53564
035;0
036;0
037;4391
038;4391
039;0
040;30000 ;0
041;0
042;
043;000.000.000.000
044;0
045;0
046;0
047;4390
048;
C;A0;EXTR.A ;0 ;0 ;0 ;0 ; ;0 ;0 ;237 ;0
C;A1;EXTR.A DOS.1;0 ;0 ;0 ;0 ; ;0 ;0 ;203 ;0
C;A2;EXTR.A DOS.2;0 ;0 ;0 ;0 ; ;0 ;0 ;203 ;0
C;A3;EXTR.A DOS.3;0 ;0 ;0 ;0 ; ;0 ;0 ;34 ;0
C;A4;EXTR.A DOS.4;0 ;0 ;0 ;0 ; ;0 ;0 ;442 ;0
C;A5;EXTR.A DOS.5;0 ;0 ;0 ;0 ; ;0 ;0 ;238 ;0
C;B0;EXTR.B ;0 ;0 ;0 ;0 ; ;0 ;0 ;587 ;0
C;B1;EXTR.B DOS.1;0 ;0 ;0 ;0 ; ;0 ;0 ;0 ;0
C;B2;EXTR.B DOS.2;0 ;0 ;0 ;0 ; ;0 ;0 ;755 ;0
C;B3;EXTR.B DOS.3;0 ;0 ;0 ;0 ; ;0 ;0 ;335 ;0
C;B4;EXTR.B DOS.4;0 ;0 ;0 ;0 ; ;0 ;0 ;676 ;0
C;B5;EXTR.B DOS.5;0 ;0 ;0 ;0 ; ;0 ;0 ;0 ;0
C;C0;EXTR.C ;0 ;0 ;0 ;0 ; ;0 ;0 ;256 ;0
C;C1;EXTR.C DOS.1;0 ;0 ;0 ;0 ; ;0 ;0 ;203 ;0
C;C2;EXTR.C DOS.2;0 ;0 ;0 ;0 ; ;0 ;0 ;203 ;0
C;C3;EXTR.C DOS.3;0 ;0 ;0 ;0 ; ;0 ;0 ;17 ;0
C;C4;EXTR.C DOS.4;0 ;0 ;0 ;0 ; ;0 ;0 ;0 ;0
C;C5;EXTR.C DOS.5;0 ;0 ;0 ;0 ; ;0 ;0 ;0 ;0