CSV'den veritabanına toplu veri yükleme: hazırlıktan doğrulamaya
CSV dosyası SQL Server, MySQL ve PostgreSQL'e nasıl aktarılır: hazırlık, ara tablo yöntemi, komutlar, doğrulama ve sık yapılan hatalar.
Aktarmadan önce CSV dosyasını tanıyın
CSV, değerlerin ayraçla ayrıldığı düz metin dosyasıdır. Görünüşte basit olması aktarımın da basit olacağı anlamına gelmez: sorunların çoğu dosyanın nasıl yazıldığını bilmemekten çıkar. Komutu çalıştırmadan önce dosyayı bir metin düzenleyicide açıp şunlara bakın.
- Ayraç: Virgül mü, noktalı virgül mü, sekme mi? Türkçe yerel ayarlı Excel genellikle noktalı virgül üretir, çünkü virgül ondalık ayracıdır.
- Başlık satırı: İlk satır sütun adlarını mı taşıyor? Taşıyorsa yükleme sırasında atlanması gerekir.
- Tırnak kullanımı: İçinde ayraç ya da satır sonu geçen alanlar tırnak içine alınmış mı?
- Karakter kodlaması: Türkçe karakterler (ç, ş, ğ, ı, İ) bozuk görünüyorsa kodlama yanlış okunuyordur. Dosyanın hangi kodlamayla kaydedildiğini öğrenin ve yükleme komutunda aynısını belirtin.
- Satır sonu: Windows ve Linux kökenli dosyalarda satır sonu karakterleri farklı olabilir.
- Boş değerler ve tarih biçimi: Boş alan NULL mı olacak, boş metin mi? Tarihler gün-ay-yıl mı, ay-gün-yıl mı yazılmış?
Bu kontrol birkaç dakikanızı alır, ama sonradan binlerce satırı elle düzeltmekten sizi kurtarır.
Ara tablo (staging) yaklaşımı: doğrudan hedef tabloya yüklemeyin
Güvenli yöntem, CSV'yi önce hedef tablonun kendisine değil, tüm sütunları metin tipinde tanımlanmış bir ara tabloya yüklemektir. Gerekçe basit: hedef tabloda tarih, sayı ya da kısıt tanımlıdır ve tek bir bozuk satır tüm yüklemeyi durdurabilir. Ara tabloda ise her şey metin olduğundan yükleme neredeyse her zaman başarıyla biter ve sorunlu satırları SQL ile inceleyebilirsiniz.
Akış şöyledir:
- Ara tabloyu CSV'nin sütunlarına birebir uyacak şekilde, hepsi metin olarak oluşturun.
- Dosyayı ara tabloya yükleyin.
- Sorgularla temizlik ve denetim yapın: boşlukları kırpın, tarih ve sayı dönüşümü başarısız olan satırları bulun, tekrar eden anahtarları tespit edin.
- Temiz satırları tip dönüşümüyle hedef tabloya INSERT ... SELECT ile aktarın.
- Hatalı satırları ayrı bir tabloda tutup kaynak sistemin sahibine geri bildirin.
- İş bitince ara tabloyu boşaltın ya da silin.
Bu yaklaşım, veri kalitesi sorumluluğunu sizin kontrolünüzdeki SQL adımlarına taşır ve sorunun hangi satırdan çıktığını görmenizi sağlar.
SQL Server'da CSV yükleme
Microsoft'un dokümantasyonu, SQL Server'a düz dosya aktarmak için birkaç yol sayar: Import Flat File Wizard, SQL Server Import and Export Wizard, BULK INSERT deyimi, bcp komut satırı aracı, OPENROWSET işlevi ve SQL Server Integration Services (SSIS). Arada seçim, tek seferlik mi yoksa tekrarlanan bir yükleme mi yaptığınıza bağlıdır. Tek seferlik küçük dosyada sihirbaz pratiktir; her gün gelen dosyada betiklenebilir yöntem gerekir.
BULK INSERT en yaygın betik yoludur. Temel kalıp:
BULK INSERT AraTablo FROM 'C:\data\customers.csv' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n');
Burada FIELDTERMINATOR ayracı, ROWTERMINATOR satır sonunu, FIRSTROW hangi satırdan okumaya başlanacağını belirtir; başlık satırı varsa FIRSTROW seçeneği eklenip başlıktan sonraki satır numarası verilir. Dokümantasyonda ayrıca CSV biçimini tanıyan FORMAT = 'CSV' ve tırnak karakterini belirten FIELDQUOTE seçenekleri ile karakter kodlamasını belirten CODEPAGE seçeneği yer alır. Tırnak içinde ayraç taşıyan alanlarınız varsa bu seçenekleri kullanın.
Bulk işleminde dosya yolu, komutu çalıştıran istemcinin değil SQL Server'ın erişebildiği yoldur; yol hatalarının büyük kısmı bu ayrımı atlamaktan çıkar.
MySQL'de LOAD DATA
MySQL'de toplu yükleme için LOAD DATA deyimi kullanılır. Genel kalıp LOAD DATA [LOCAL] INFILE 'dosya' INTO TABLE tablo biçimindedir; ardından FIELDS TERMINATED BY ile ayraç, ENCLOSED BY ile alanı çevreleyen tırnak karakteri, LINES TERMINATED BY ile satır sonu, IGNORE ... LINES ile atlanacak başlık satırı ve CHARACTER SET ile kodlama belirtilir. İsteğe bağlı sütun listesiyle dosyadaki sütunları tablodaki sütunlarla eşleştirebilir, SET ifadesiyle de değer dönüşümü yapabilirsiniz.
MySQL dokümantasyonu güvenlikle ilgili ayarlara dikkat çeker. İlki LOCAL ifadesidir: dosya istemci makinesinden okunacaksa LOCAL gerekir, ancak sunucuda local_infile ayarı kapalıysa komut hata verir. İkincisi secure_file_priv değişkenidir: bu ayar dolu bir dizin adıysa sunucu tarafındaki dosyanın o dizinde bulunması şarttır. Yani 'dosya bulunamadı' ya da 'izin yok' hatasında önce bu ayarları kontrol edin.
Bu deyim, satır satır INSERT göndermeye göre toplu yükleme için tasarlandığından büyük dosyalarda tercih edilen yoldur. Yine de ara tablo yaklaşımını burada da uygulamak, tarih ve sayı dönüşümünü SET ifadesine gömmekten daha izlenebilir olur.
PostgreSQL'de COPY
PostgreSQL'de CSV yüklemek için COPY deyimi kullanılır. Kalıp COPY tablo FROM 'dosya' WITH (FORMAT csv, HEADER true, DELIMITER ';') biçimindedir. Dokümantasyondaki seçenekler arasında FORMAT, DELIMITER, NULL (hangi metnin NULL sayılacağı), HEADER (ilk satırın başlık olup olmadığı), QUOTE, ESCAPE ve ENCODING bulunur. Türkçe karakter sorunu yaşıyorsanız ENCODING seçeneğini dosyanın gerçek kodlamasına göre ayarlayın.
Dikkat edilecek ayrım: COPY, dosyayı sunucu makinesinde okur ve bunun için yetkili bir rol (örneğin pg_read_server_files rolü) gerekir. Dosyanız kendi bilgisayarınızdaysa psql içindeki \copy komutu kullanılır; bu komut dosyayı istemci tarafında okuyup sunucuya akıtır. Bulut üzerinde yönetilen bir PostgreSQL kullanıyorsanız sunucudaki dosyaya zaten erişemezsiniz, dolayısıyla \copy ya da sağlayıcının kendi yükleme aracı gerekir.
Tüm sistemlerde mantık aynı kalır: ayracı, başlığı, tırnağı ve kodlamayı doğru bildirmek yüklemenin başarısını belirler.
Yüklemeden sonra doğrulama
Yükleme komutunun hatasız bitmesi verinin doğru geldiği anlamına gelmez. Bitişte şu denetimleri yapın:
- Satır sayısı: Dosyadaki veri satırı sayısı ile tablodaki kayıt sayısı eşleşiyor mu? Başlık satırını hesaba katmayı unutmayın.
- Toplam kontrolü: Dosyada tutar ya da miktar sütunu varsa, kaynak toplamıyla tablodaki SUM sonucunu karşılaştırın.
- Boş ve uç değerler: MIN, MAX ve NULL sayımıyla beklenmedik değerleri yakalayın. Örneğin geleceğe dönük bir doğum tarihi ya da negatif miktar bir dönüşüm hatasına işaret edebilir.
- Tekrarlar: Anahtar olması gereken sütunda GROUP BY ... HAVING ile mükerrer kayıt arayın.
- Türkçe karakterler: Birkaç satırda ad ve adres alanlarına gözle bakın.
Bu denetim sorgularını bir kez yazıp betiğin parçası yapın. Aynı dosya biçimi ilerleyen günlerde yeniden geldiğinde hem yükleme hem doğrulama otomatikleşir.
Sık yapılan hatalar
- Yanlış ayraç: Tek sütunlu tabloya tüm satırın yazılması ya da sütun sayısı uyuşmazlığı hatası genellikle ayraç yanlışlığıdır.
- Kodlama sorunu: ç, ş, ğ gibi harflerin garip sembollere dönüşmesi kodlama uyuşmazlığını gösterir; yükleme komutuna kodlamayı açıkça verin.
- Başlığın veri sanılması: Başlık satırı atlanmazsa ilk satır sayı sütununa metin olarak girmeye çalışır ve dönüşüm hatası verir.
- Ondalık ayracı karışıklığı: Virgülle yazılmış ondalık sayıyı noktalı bekleyen bir sütuna yüklemek tutarları bozar. Ara tabloda metin olarak alıp dönüştürmek bu sorunu görünür kılar.
- Doğrudan üretim tablosuna yükleme: Sorun çıktığında geri dönüş zorlaşır. Önce ara tablo, sonra INSERT ... SELECT kullanın.
- Yetki ve dosya yolu hataları: Sunucu tarafı yükleme komutlarında dosyanın sunucudan erişilebilir olması gerekir.
- Excel'de CSV'yi açıp kaydetmek: Excel baştaki sıfırları atabilir, uzun sayıları bilimsel gösterime çevirebilir ve tarihleri yeniden biçimlendirebilir. Ham CSV'yi Excel'de düzenleyip yeniden kaydetmek yerine olduğu gibi yükleyin.
Bu beceriyi Mindset programlarında nerede çalışırsınız?
SQL ile Programlama Eğitiminin modül başlıkları arasında Veritabanları Oluşturma, Tablolarla Çalışma, Veri İşleme Dili, Sorgular, Dışa Aktarma ve Görüntüleme yer alır. Ara tablo oluşturma, INSERT ... SELECT ile veri taşıma ve sorgularla doğrulama bu başlıkların günlük işe dönüşen kısmıdır. Veritabanı Yönetim Sistemleri ve Uygulamaları programı ise İlişkisel Veritabanları ve SQL, Veri Modelleme ve Tasarım, Veritabanı Yönetimi ve Optimizasyon, Güvenlik ve Yetkilendirme başlıklarını içerir; yükleme yetkileri ve hedef tablo tasarımı bu çerçevede ele alınabilecek konulardır. Operasyon ve raporlama ekiplerinde dosyayla gelen veriyi düzenli olarak sisteme alan çalışanlar için uygundur.
İlgili Mindset programı
SQL ile Programlama Eğitimi
Sık sorulan sorular
CSV dosyasını SQL'e aktarmanın en kolay yolu nedir?
Tek seferlik ve küçük bir dosya için SQL Server Import and Export Wizard gibi sihirbazlar ya da kullandığınız veritabanı aracının içe aktarma ekranı yeterlidir. Dosya düzenli olarak geliyorsa BULK INSERT, LOAD DATA ya da COPY gibi komutlarla betik yazmak daha sürdürülebilirdir.
Türkçe karakterler bozuk geliyor, ne yapmalıyım?
Sorun neredeyse her zaman dosyanın kodlaması ile yükleme sırasında belirtilen kodlamanın uyuşmamasıdır. Dosyanın hangi kodlamayla kaydedildiğini öğrenin; SQL Server'da CODEPAGE, MySQL'de CHARACTER SET, PostgreSQL'de ENCODING seçeneğiyle aynısını belirtin. Dosyayı farklı kodlamada yeniden kaydetmek de çözümlerden biridir.
Başlık satırını nasıl atlarım?
SQL Server BULK INSERT'te FIRSTROW seçeneğini başlıktan sonraki satıra ayarlarsınız. MySQL'de IGNORE ... LINES ifadesini, PostgreSQL COPY komutunda ise HEADER seçeneğini kullanırsınız. Başlığı atlamazsanız genellikle ilk satırda tip dönüşüm hatası alırsınız.
Çok büyük dosyalar yüklenebilir mi?
Evet, toplu yükleme komutları bunun için tasarlanmıştır ve satır satır INSERT göndermekten çok daha verimlidir. Büyük dosyalarda ara tabloya yüklemek, yüklemeden önce dizinleri geçici olarak kaldırmak ve doğrulamayı yükleme sonrasında toplu sorgularla yapmak yaygın uygulamadır.
Excel dosyası ile CSV aktarımı aynı şey mi?
Hayır. CSV düz metindir, Excel çalışma kitabı ise biçimlendirme, formül ve birden çok sayfa taşıyabilen ikili bir dosyadır. Excel verisini veritabanına almanın en güvenli yolu çoğunlukla sayfayı CSV olarak dışa aktarıp yukarıdaki yöntemle yüklemektir.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Mühendisliği ve MLOps