Ana içeriğe geç
Kesit Power BI
Temel · Veri Hazırlama

Power Query: metin, sayı ve tarih dönüşümleri

Metni kırpmak, birleştirmek ve parçalamak; sayıyı yuvarlamak ve çarpmak; tarihten yıl, ay, gün adı ve süre çıkarmak. Dönüştür ile Sütun ekle sekmelerinin farkı, yerel ayarla tür değiştirme ve aynı işi DAX’ta yapmanın bedeli.

Uygulamada aç, 5 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

“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.

SekmeNe olur?Arka plandaki MNe zaman?
Dönüştür (Transform)Seçili sütun yerinde değişir; eski değer kalmaz.Table.TransformColumnsEski 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 yeriM karşılığı
Kırp (Trim): baş ve sondaki boşluklarBiçimText.Trim
Temizle (Clean): satır sonu gibi görünmez karakterlerBiçimText.Clean
BÜYÜK, küçük, Her Sözcüğün İlk HarfiBiçimText.Upper, Text.Lower, Text.Proper
Önek / sonek ekle (Add prefix / suffix)Biçimeach "TR-" & _
Uzunluk (Length)AyıklaText.Length
İlk / son karakterler, aralıkAyıklaText.Start, Text.End, Text.Middle
Sınırlayıcılar arasındaki metinAyıklaText.BetweenDelimiters
Sütunları birleştir (Merge Columns), ayraçlaMetin sütunuTable.CombineColumns, Text.Combine
Değerleri değiştir (Replace Values)Giriş / DönüştürTable.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.

Türkçe İ sorunuKültür vermeden büyük harfe çevirmek “izmir”i “IZMIR” yapar. Şeritteki komut ya da 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

Yuvarlama iki dilde farklıM’de 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ılanM karşılığıÖrnek (27.04.2023)
Yıl, ay, günDate.Year, Date.Month, Date.Day2023, 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.WeekOfYear17
ÇeyrekDate.QuarterOfYear2
Ay başı / ay sonuDate.StartOfMonth, Date.EndOfMonth01.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
Olgu tablosuna takvim sütunu eklemeSatislar tablosunun her satırına Yıl, Ay, Gün adı yazmak yerine “Tarih tablosu” dersindeki gibi ayrı bir takvim kullan. Olgu tablosunda yalnızca tarih kalsın; ay adı, çeyrek ve hafta takvimden gelsin. Tarih dönüşümleri en çok, takvimi kendisi kuran tablolar ve kaynakta düzeltilmesi gereken metin tarihler için gerekir.

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.

Alıştırmalara geç (5)