CSV verisinin MySQL Shell Üzerinden Veritabanına Aktarılması

Share Button

MySQL shell arabirimi ile satır adedi yüksek verilerinizi ekstra bir betik yazmaksızın SQL komutları ile hızlıca içeri alabilirsiniz.

Aşağıdaki örnekde görülen dosyada 1 başlık, 8022 veri satırı bulunmaktadır.

LOAD DATA LOCAL INFILE 'hede-ticaret.csv'
INTO TABLE catalog_stock 
FIELDS TERMINATED BY ',' ENCLOSED BY '\"' 
LINES TERMINATED BY '\n' STARTING BY ''
IGNORE 1 LINES
(@ignore, code, name, @ignore, @ignore, brand, status, @ignore, provider)
SET status = 0, `provider`='hede'; 

Dilerseniz yukarıdaki örneği birlikte satır satır inceleyelim.

LOAD DATA LOCAL INFILE 'hede-ticaret.csv'

Verilerin hangi dosyadan okunacağını belirttik.

INTO TABLE catalog_stock 

Okunan verilerin hangi tabloya yazılacağını belirttik.

FIELDS TERMINATED BY ',' ENCLOSED BY '\"' 

Yukarıdaki TERMINATED BY ifadesi ile her bir alanın hangi karakter ile sonlandığını (bunu alan ayracı olarak da ifade edebiliriz.), ENCLOSED BY ifadesi ile alanın kapsayıcı karakterini tanımlıyoruz. Bu tanımlama herhangibir alanın içeriğinde alan ayracını içeren bir veri varsa parser ın bunun aslında alanın içeriğine dahil olduğunu anlamasını sağlıyor.

LINES TERMINATED BY '\n' STARTING BY ''

Her bir satırın \n karakteri ile sonlandığını boş metin ile başladığını belirttik.

IGNORE 1 LINES

Örnekde kullandığım dosyanın ilk satırının başlık/alan isimlerini içerdiğini belirtmiştim. Yukarıdaki tanımlama ile ilk satırı yok sayıyoruz.

(@ignore, code, name, @ignore, @ignore, brand, status, @ignore, provider)
SET status = 0, `provider`='hede'; 

Verdiğim örnekde veritabanındaki alan sayısı ve sırası csv dosyasınınkinden farklı olduğu için yukarıdaki tanımlamayla csv dosyasının ilk kolonundan başlayarak veritabanındaki hangi alanla eşleşeceği bilgisini tanımlıyoruz. Ayrıca SET komutu ile de status ve provider alanları için varsayılan bir değer yazdırıyoruz.
Yukarıda gördüğünüz @ignore ifadesi csv dosyasında bulunan, ancak veritabanında karşılığı olmayan alanlar için csv satırından gelen veriyi ignore isimli bir değişkene göndererek sıradaki alanla ilgili eşleştirmenin pas geçilmesini sağlıyor.

Son olarak yukarıdaki komutların çıktısı aşağıda görüldüğü gibidir.

Query OK, 8022 rows affected, 8022 warnings (0.16 sec)
Records: 8022  Deleted: 0  Skipped: 0  Warnings: 8022

Gerçekleştirdğiniz içe alım işlemi ile ilgili hataları görmek için SHOW WARNINGS komutunu kullanabilirsiniz.

SHOW WARNINGS LIMIT 0,10;

Sonuç:

+---------+------+----------------------------------------------------------------------------+
| Level   | Code | Message                                                                    |
+---------+------+----------------------------------------------------------------------------+
| Warning | 1262 | Row 1 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 2 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 3 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 4 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 5 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 6 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 7 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 8 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 9 was truncated; it contained more data than there were input columns  |
| Warning | 1262 | Row 10 was truncated; it contained more data than there were input columns |
+---------+------+----------------------------------------------------------------------------+

Yukarıdaki örnekde kullandığım csv dosyası veritabanındaki tabloda yeralan alan sayısından daha fazla alan içeriyordu. Bu nedenle her bir satır için “Row N was truncated; it contained more data than there were input columns” hatasını aldım.

Karşılaşılabilecek Problemler:

ERROR 1148 (42000): The used command is not allowed with this MySQL version

LOAD DATA komutu metin dosyasını istemci makinede arayacaktır. Ancak bu durum bazı güvenlik sorunlarına neden olabileceği için mysql client, –local-infile=1 parametresi ile çalıştırılmalıdır.

LOAD DATA komutu ile ilgili diğer detaylar için bu dökümanı inceleyebilirsiniz.

Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır.
Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir.
Halen Markafoni back end geliştirici olarak çalışmaktadır.

One comment

  • Erol Aydın
    Mayıs 22, 2015 - 9:03 pm | Permalink

    Yararlı ve stabil.Çoğu yerde bulamazsınız tamamen özgün

  • Bir Cevap Yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir