Önce belirtiyi ayırın
Bir müşteri listesini indirdiniz. Excel’de İzmir yerine garip karakterler var; başka bir dosyada bütün satır tek hücreye doluyor; üçüncüsünde müşteri numarası 00123 yerine 123 görünüyor. Bunlar aynı hata değildir. İlkinde baytların hangi karakterlere çevrileceği, ikincisinde alanların nereden bölüneceği, üçüncüsünde hücrenin hangi veri türü sayılacağı yanlış seçilmiştir. Dosya uzantısını değiştirmek veya bütün metni bul/değiştir ile elden geçirmek bu üç sorunu birlikte çözmez. İlk işiniz kaynaktan gelen dosyanın bir kopyasını saklamak olsun. Bozuk görünen dosyayı yeniden CSV olarak kaydetmeden önce, dosyanın kendisini düz metin olarak inceleyin.
| Belirti | İlk kontrol | Düzeltme |
|---|---|---|
| Bozuk Türkçe harfler | Kaynak kodlaması | Doğru kodlamayla yeniden içe alın |
| Her satır tek sütun | Virgül / noktalı virgül / sekme | Önizlemede ayracı seçin |
| 00123 → 123 | Otomatik tür dönüşümü | Kimlik sütununu metin alın |
Aynı dosyada üç belirti birden görülebilir; her katmanı ayrı doğrulayın.
UTF-8 ve BOM neyi değiştirir?
CSV bir Excel çalışma kitabı değildir; satırlardan ve alanlardan oluşan metindir. Türkçe harflerin dosyadaki baytları bir karakter kodlamasına göre yazılır. Okuyucu başka bir kodlama varsayarsa doğru baytlar yanlış karakterlere dönüşebilir. UTF-8 dosyasının başına eklenen BOM, EF BB BF adlı üç bayttır; bazı okuyuculara kodlamayı tanımaları için işaret verir. Microsoft, BOM ile kaydedilen UTF-8 CSV dosyalarının Excel’de normal biçimde açılabildiğini, diğer durumlarda metin/CSV içe aktarma yolunun kullanılabileceğini anlatır. Bu öneri BOM’un ayracı, tarih biçimini veya hücre türünü belirlediği anlamına gelmez.
BOM eklemek zaten yanlış çözümlenip tekrar kaydedilmiş metni onarmaz. Dosyada İzmir yerine gerçekten soru işareti yazıyorsa kaybolan harfi yalnız dosyaya bakarak her zaman çıkaramazsınız. Özgün indirmeye, veritabanına veya yedeğe dönün. Kaynak Windows-1254 gibi başka bir kodlama kullanıyorsa önce o kodlamayla okuyup UTF-8 olarak dışa aktarın; gelişigüzel kodlama değiştirip üstüne kaydetmeyin. Bir UTF-8 dosyasını yeniden UTF-8 diye kaydetmek de yanlış ayracı düzeltmez. Kontrolü küçük bir örnekle yapıp doğrulanmış ayarları bütün dışa aktarıma uygulamak daha güvenilirdir.
Excel’de kontrollü içe alma
Microsoft 365’in masaüstü sürümünde boş çalışma kitabıyla başlayın. Veri sekmesinden Metinden/CSV’den yolunu açıp kaynak dosyayı seçin; İngilizce arayüzde bu seçenek Data → From Text/CSV olarak görünür. Önizlemede dosya kaynağını UTF-8 olarak seçin ve İzmir, Iğdır, Şırnak gibi gerçek değerleri kontrol edin. Menü adları ve kullanılabilir seçenekler Excel sürümüne ve işletim sistemine göre değişebilir. Amaç dosyaya çift tıklayınca seçilen varsayımlara güvenmek yerine kodlamayı, ayracı ve veri türlerini görerek onaylamaktır. Önizlemede sütun sayısı yanlışsa henüz yükleme düğmesine basmayın.
Kimlik alanları için Veriyi Dönüştür seçeneğiyle Power Query’ye geçin. Otomatik eklenen Değiştirilen Tür adımı numaraları çoktan sayıya çevirmişse o adımı kaldırın veya ilgili dönüşümü kaynak metin aşamasında düzeltin; ardından müşteri kodu ve telefon gibi sütunları Metin yapın. Sayıya çevrilmiş 123 değerini sonradan metin yapmak 00123 biçimini geri üretmez. Ondalık veya tarih sütunlarında yerel ayar ayrıca önemlidir: 12,50 ve 12.50 farklı bölgesel kurallarda okunur. İçe alınan veriyi çalışma kitabı olarak saklamak, sonraki açılışta aynı tür tahminlerinin yeniden yapılmasını önler.
Virgül mü, noktalı virgül mü?
CSV adı virgülü çağrıştırsa da gerçek hayattaki dışa aktarımlar noktalı virgül veya sekme kullanabilir. Türkçe bölgesel ayarlarda ondalık virgül yaygın olduğundan noktalı virgüllü listelerle sık karşılaşılır; yine de dili görünce ayracı tahmin etmek yeterli değildir. Dosyanın ilk birkaç kaydına bakın ve önizlemede başlıkların ayrı sütunlara oturduğunu doğrulayın. İçe alma ekranında seçilen ayraç dosyadaki ayraçla eşleşmelidir. Bütün virgülleri noktalı virgüle çevirmeyin: bir adresin içindeki virgül veya bir tutarın ondalık işareti de değişir. Ayraç değiştirme işlemi CSV ayrıştırıcısıyla yapılmalıdır.
01id;city;note0200123;İzmir;"Istanbul; office"0300456;Iğdır;"He said ""hello"""Örnekte not alanındaki noktalı virgül yeni sütun başlatmaz; alan çift tırnak içine alınmıştır. Alanın kendi çift tırnağı ise iki çift tırnakla gösterilir. Tırnaklı alanların içinde satır sonu da bulunabilir; dolayısıyla dosyayı satırlara bölüp her satırda split çalıştırmak genel bir CSV okuyucusu değildir. Satır sayısını yalnız metin editörünün satır numarasına bakarak hesaplamak da yanıltır. Dışa aktardığınız dosyayı aynı ayraçla yeniden okuyun ve beklenen alan sayısı ile kritik değerleri karşılaştırın. Küçük örnekte bile bu kontrol sessiz kaymaları görünür yapar.
Tekrarlanabilir UTF-8 BOM dışa aktarımı
Aşağıdaki Python örneği standart kütüphaneyi kullanır. utf-8-sig yazarken BOM ekler, okurken başlangıçtaki işareti tüketir. newline parametresi satır sonlarını CSV modülüne bırakır; lineterminator bu örnekte CRLF üretir. Kimlikler baştan metindir. Bu program dosyayı yazıp yeniden okuyarak harfleri, baştaki sıfırları ve tırnakları karşılaştırır. Burada kanıtlanan şey Python ile dosya turudur; Excel’in belirli bir sürümdeki görsel sonucu değildir. Excel uygulaması bu çalışma sırasında açılmadı ve bir ekran görüntüsü üretilmedi. Okuyucu aynı dosyayı yukarıdaki içe alma yoluyla kendi Excel sürümünde ayrıca doğrulamalıdır.
01import csv02from pathlib import Path03 04rows = [05 ["id", "city", "note"],06 ["00123", "İzmir", "Istanbul; office"],07 ["00456", "Iğdır", 'He said "hello"'],08]09with open("customers.csv", "w", encoding="utf-8-sig", newline="") as f:10 csv.writer(f, delimiter=";", lineterminator="\r\n").writerows(rows)11 12raw = Path("customers.csv").read_bytes()13print("BOM:", raw[:3].hex(" "))14with open("customers.csv", encoding="utf-8-sig", newline="") as f:15 restored = list(csv.reader(f, delimiter=";"))16print("rows:", len(restored), "columns:", len(restored[0]))17print("first record:", restored[1])18assert restored == rows19print("round trip: OK")01BOM: ef bb bf02rows: 3 columns: 303first record: ['00123', 'İzmir', 'Istanbul; office']04round trip: OKBaştaki sıfırlar ve uzun kimlikler
Bir kimlik numarası matematikte kullanılacak sayı olmak zorunda değildir. 00123 ile 123 sisteminizde iki ayrı kayıt anlamına gelebilir. CSV içindeki alanı çift tırnakla yazmak yalnız alan sınırını korur; Excel’e “bu sütun metindir” komutu vermez. Telefon, posta kodu ve uzun sipariş numaralarını içe alırken metin türünü açıkça belirleyin. Uzun sayısal diziler sayıya dönüşürken hassasiyet de kaybedebilir. Hücreye özel sayı biçimi verip sıfır göstermek görünümü değiştirir; kaynak kimliğin aynen saklandığını tek başına kanıtlamaz. Karşılaştırmayı dosyadaki özgün dizeyle yapın ve mümkünse uygulama sınırında da metin türü kullanın.
Sıfırları zaten kaybettiyseniz önce özgün dosyanın hâlâ 00123 içerip içermediğine bakın. İçeriyorsa yeniden içe alın. İçermiyorsa yalnız 123 değerinden önce kaç sıfır olduğunu kesin belirleyemezsiniz. Tüm kodların beş basamaklı olduğuna dair doğrulanmış bir iş kuralı varsa doldurma uygulanabilir; bu kural olmadan yapılan tahmin veri onarımı değildir. Benzer biçimde CSV tarih hücrelerinin biçimini taşımaz. 03/04/2026 gibi bir değeri yorumlayan taraf hangi gün ve ay sırasını beklediğini bilmelidir. Veri sözleşmesine örnek kayıt, kodlama, ayraç ve sütun türleri eklemek tekrar eden hataları azaltır.
Formül enjeksiyonunu atlamayın
Kullanıcının yazdığı bir not veya firma adı elektronik tabloya girdiğinde ayrı bir risk ortaya çıkar: bazı başlangıç karakterleri hücrenin formül gibi yorumlanmasına yol açabilir. CSV alanını çift tırnaklamak bu davranışı güvenli hâle getirmez; CSV kaçış kuralı ve formül yorumu ayrı katmanlardır. Özellikle eşittir, artı, eksi veya @ ile başlayan güvenilmeyen alanları ve bunların önüne gelen denetim karakterlerini değerlendirin. Her veri türüne körlemesine tek tırnak eklemek de sayısal alanların anlamını değiştirebilir. Uygulamanızın hedef tablo programlarına göre açık bir dışa aktarım politikası seçin ve gerçek istemcilerde sınayın.
JSON’dan tabloya güvenilir geçiş
API yanıtıyla başlıyorsanız önce JSON formatlayıcı ile sözdizimini kontrol edin. Ardından JSON ↔ CSV dönüştürücü ile alanları tabloya taşıyın; çıktıda kullanılacak ayraç ve BOM tercihini alıcı uygulamayla eşleştirin. İç içe nesneleri hücrede JSON olarak mı tutacağınız, alan adlarını düzleştireceğiniz mi yoksa ayrı tablo kuracağınız mı bir veri modelleme kararıdır. Dizi içeren kayıtları gelişigüzel metne çevirirseniz ters dönüşümde aynı yapıyı elde edemeyebilirsiniz. Kimlik değerini kaynak JSON’da da dize olarak koruyun; yalnız dışa aktarım aşamasında karar vermek geç kalabilir.
Son kontrolde yalnız harflerin düzgün görünmesine bakmayın. Beklenen kayıt sayısını, başlıkları, sütun sayısını, tırnak içindeki ayraçları, boş alanları ve birkaç uzun kimliği karşılaştırın. Dosyayı başka birine gönderecekseniz kodlama ile ayracı kısa bir notta belirtin; örneğin “UTF-8 BOM, noktalı virgül, id sütunu metin”. Sorun yalnız İ/i veya ı/I dönüşümünde çıkıyorsa bu bir kodlama hatası olmayabilir: Türkçe İ sorunu yazısında dil kuralları ayrı ele alınıyor. Doğru teşhis, her indirmede aynı elle düzeltmeleri yapmak yerine veri üretimi ve içe alma arasında tekrar kullanılabilir bir anlaşma kurmanızı sağlar.
Kaynaklar
Resmî belgeler ve güvenlik rehberi 15 Ekim 2026’da kontrol edildi.
- Microsoft: Opening CSV UTF-8 files correctly in Excel
- Microsoft: Import or export text (.txt or .csv) files
- Microsoft: Keeping leading zeros and large numbers
- Python: csv — CSV File Reading and Writing
- OWASP: CSV Injection
Python örneği yerelde çalıştırıldı. Excel arayüzü test edilmedi; menüler sürüme göre değişebilir. Kaynak dosyanın kopyasını koruyun.