“Power Query ile veri temizleme” dersinde kirli bir Excel sayfasını başlık, tür ve boş satır açısından düzelttik. Bu ders bir adım ileri gidiyor: sütunların içeriğini değiştiren komutlar. Hepsi şeritte üç grupta durur: Metin, Sayı ve Tarih ve Saat. Her komut, arka planda tek satırlık bir M fonksiyonu yazar.
Önce karar: Dönüştür mü, Sütun ekle mi?
Aynı komutların çoğu iki sekmede birden bulunur. Fark, sonucun nereye yazıldığıdır.
| Sekme | Ne olur? | Arka plandaki M | Ne zaman? |
|---|---|---|---|
| Dönüştür (Transform) | Seçili sütun yerinde değişir; eski değer kalmaz. | Table.TransformColumns | Eski değere ihtiyacın yoksa: boşluklu şehir adını düzeltmek gibi. |
| Sütun ekle (Add Column) | Sonuç yeni bir sütuna yazılır; kaynak sütun durur. | Table.AddColumn | İkisi de lazımsa: Tarih dururken yanına Ay adı eklemek gibi. |
Örnek: Tarih sütununu seçip Dönüştür → Tarih → Ay → Ay adı dersen tarih kaybolur, yerine “Ocak” yazar. Artık o sütunla Tarih tablosuna ilişki kuramazsın. Aynı komutu Sütun ekle sekmesinden çalıştırırsan tarih korunur.
Metin dönüşümleri
| İşlem | Şeritteki yeri | M karşılığı |
|---|---|---|
| Kırp (Trim): baş ve sondaki boşluklar | Biçim | Text.Trim |
| Temizle (Clean): satır sonu gibi görünmez karakterler | Biçim | Text.Clean |
| BÜYÜK, küçük, Her Sözcüğün İlk Harfi | Biçim | Text.Upper, Text.Lower, Text.Proper |
| Önek / sonek ekle (Add prefix / suffix) | Biçim | each "TR-" & _ |
| Uzunluk (Length) | Ayıkla | Text.Length |
| İlk / son karakterler, aralık | Ayıkla | Text.Start, Text.End, Text.Middle |
| Sınırlayıcılar arasındaki metin | Ayıkla | Text.BetweenDelimiters |
| Sütunları birleştir (Merge Columns), ayraçla | Metin sütunu | Table.CombineColumns, Text.Combine |
| Değerleri değiştir (Replace Values) | Giriş / Dönüştür | Table.ReplaceValue |
Değerleri değiştir iki biçimde çalışır. Hücrenin tamamı eşleşsin işaretliyse yalnızca tam olarak “-” olan hücre değişir (Replacer.ReplaceValue). İşaret kaldırılırsa metnin içindeki her geçiş değişir (Replacer.ReplaceText): “Merkez Bayi” içindeki “ Bayi” silinir ve “Merkez” kalır.
let
Kaynak = Musteriler,
Kirpilmis = Table.TransformColumns(Kaynak, {{"Sehir", Text.Trim, type text}}),
Etiket = Table.AddColumn(Kirpilmis, "Konum",
each Text.Combine({[Sehir], [Bolge]}, " / "), type text),
Kod = Table.AddColumn(Etiket, "MusteriKodu",
each "M-" & Text.PadStart(Text.From([MusteriNo]), 4, "0"), type text),
Kisa = Table.AddColumn(Kod, "SehirKisa",
each Text.Upper(Text.Start([Sehir], 3), "tr-TR"), type text)
in
Kisa
Text.Combine boş (null) parçaları atlar. Musteriler tablomuzda şehri boş müşteriler var. Onlarda Konum yalnızca bölge adı olur, başında fazladan ayraç kalmaz.
Text.Upper([Sehir], "tr-TR") “İZMİR” üretir. Dilimleyicide aynı şehrin iki yazımı görünüyorsa önce buna bak.Sayı dönüşümleri
- Standart: topla, çarp, böl, yüzde. İki sütunu seçip Sütun ekle → Standart → Çarp dersen
[Adet] * [BirimFiyat]gibi satır tutarı sütunu oluşur. Yüzde komutu sütunun belirli bir yüzdesini hesaplar (ör. KDV için %20). - Yuvarlama:
Number.Round,Number.RoundUp,Number.RoundDown. - Bilimsel: mutlak değer (
Number.Abs), karekök (Number.Sqrt), logaritma (Number.Log10,Number.Ln), üs.
Number.Round varsayılan olarak çifte yuvarlar (RoundingMode.ToEven): 2,5 → 2, 3,5 → 4. DAX’ta ROUND(2.5, 0) ise 3 verir. Muhasebe toplamlarını eşleştirmen gerekiyorsa M’de kipi açıkça yaz: Number.Round([Tutar], 0, RoundingMode.AwayFromZero).Mutlak değer, iade satırları eksi tutarla gelen bir sistemde “hareket büyüklüğü” için işe yarar. Logaritma ve karekök ise rapor için nadiren gerekir: çok çarpık bir dağılımı (birkaç dev müşteri, yüzlerce küçük müşteri) dağılım grafiğinde okunur yapmak ya da bir modele girdi hazırlamak için kullanılır. Rapordaki eksenin logaritmik olması yetiyorsa veriyi değiştirme; görselin eksen ayarını kullan.
Tarih dönüşümleri
| Çıkarılan | M karşılığı | Örnek (27.04.2023) |
|---|---|---|
| Yıl, ay, gün | Date.Year, Date.Month, Date.Day | 2023, 4, 27 |
| Ay adı | Date.MonthName([Tarih], "tr-TR") | Nisan |
| Gün adı | Date.DayOfWeekName([Tarih], "tr-TR") | Perşembe |
| Yılın haftası | Date.WeekOfYear | 17 |
| Çeyrek | Date.QuarterOfYear | 2 |
| Ay başı / ay sonu | Date.StartOfMonth, Date.EndOfMonth | 01.04.2023, 30.04.2023 |
İki tarih arasındaki süre için iki sütunu seçip Sütun ekle → Tarih → Günleri çıkar komutunu kullan; sonuç bir süre (duration) değeridir, Duration.Days onu gün sayısına çevirir. Yaş (Age) komutu ise bugünle fark alır: her yenilemede değer değişir. Bu bazen istenir (müşterinin bugünkü yaşı), bazen yanıltır (siparişin verildiği andaki yaş).
let
Kaynak = Siparisler,
Sure = Table.AddColumn(Kaynak, "TeslimGunu",
each Duration.Days([TeslimTarihi] - [Tarih]), Int64.Type),
AyAdi = Table.AddColumn(Sure, "AyAdi",
each Date.MonthName([Tarih], "tr-TR"), type text)
in
AyAdi
Yerel ayarla tür değiştirme
“03/04/2024” ABD biçiminde 4 Mart değil 3 Nisan değildir; tam tersidir. Power Query metni çözerken dosyanın yerel ayarını (locale) kullanır. Kaynak dosya başka bir ülkeden geliyorsa sütun başlığına sağ tıkla: Türü değiştir → Yerel ayarı kullanarak (Using Locale). Açılan pencerede hedef türü ve kaynağın yerel ayarını seç. Arka planda Table.TransformColumnTypes fonksiyonuna üçüncü bir bağımsız değişken eklenir:
Table.TransformColumnTypes(Kaynak, {{"Tarih", type date}, {"Tutar", type number}}, "en-US")
Aynı ayar sayıları da etkiler: “1,250.50” en-US ile 1250,5 okunur, tr-TR ile hata verir. Dosyanın varsayılan yerel ayarı Seçenekler → Geçerli dosya → Bölgesel ayarlar altındadır.
Aynı işi DAX’ta yapmak
Bir ay adı sütununu DAX’ta hesaplanmış sütun olarak da yazabilirsin:
Ay Adı = FORMAT(Satislar[Tarih], "MMMM")
Sonuç aynı görünür ama maliyeti farklıdır. Hesaplanmış sütun, Power Query yüklemesi bittikten sonra modelde ayrıca hesaplanır; yenileme süresine eklenir ve kaynakta yapılan sütunlar kadar iyi sıkıştırılmaz. Sorgu katlamayla kaynağa da gönderilemez, başka modeller (ör. veri akışları) onu yeniden kullanamaz. Genel kural: dönüşümü olabildiğince kaynağa yakın, gerektiği kadar rapora yakın yap. Satır düzeyindeki temizlik Power Query’nin işidir.
DAX’ın gerçekten gerekli olduğu yer, hesaplamanın model ilişkilerine ya da filtre bağlamına ihtiyaç duyduğu durumlardır. Örneğin müşterinin sipariş anındaki ortalama yaşını bir ölçüyle hesaplamak, her satış satırına yaş sütunu yazmaktan esnektir; kategoriye ve yıla göre kendiliğinden değişir:
Ortalama Alım Yaşı = AVERAGEX(Satislar, YEAR(Satislar[Tarih]) - RELATED(Musteriler[DogumYili]))
Modelimizde bu değer tüm satışlarda yaklaşık 41,5; 2022’de 38,1, 2024’te 42,0’dır.