Vala ile metinleri Türkçe alfabeye göre sıralama
Eğer veritabanı kullanıyorsanız örneğin Türkçe'ye göre sıralama yapmak oldukça zahmetli olabilir. Ya da diyelim ki hem yabancı dilde hem Türkçe sıralama yapmanız gerekebilir.
Diyelim ki aşağıdaki bir MongoDB belgesi olsun.
{
isim: "abc",
sırala_tr: "010203"
}
Sıralama yapmak için o dilde bir sıralama anahtarı oluşturmak gerekiyor.
Şöyleki a harfini 01, b harfini 02, c harfini 03 ile değiştiriyoruz.
Böylelikle "abc" kelimesi "010203" oluyor.
Bunun için Vala ile aşağıdaki örnek programı yazdık.
Örneği sirala.vala ismi ile kaydediniz.
// valac sirala.vala -o sirala
string turkceSirala (string kelime)
{
string sonuc = kelime;
string[] buyukHarfler = {"A", "B", "C", "Ç", "D", "E", "F",
"G", "Ğ", "H", "I", "İ", "J", "K", "L", "M", "N",
"O", "Ö", "P", "R", "S", "Ş", "T", "U", "Ü", "V", "Y", "Z"};
string[] alfabe = {"a", "b", "c", "ç", "d", "e", "f",
"g", "ğ", "h", "ı", "i", "j", "k", "l", "m", "n",
"o", "ö", "p", "r", "s", "ş", "t", "u", "ü", "v", "y", "z"};
string[] karsilik = {"01", "02", "03", "04", "05", "06", "07",
"08", "09", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29"};
for (int i = 0; i < alfabe.length; ++i)
{
sonuc = sonuc.replace(alfabe[i], karsilik[i]);
}
for (int i = 0; i < buyukHarfler.length; ++i)
{
sonuc = sonuc.replace(buyukHarfler[i], karsilik[i]);
}
return sonuc;
}
void ikiliYazdir(string bir, string iki)
{
stdout.printf("%s=>%s\n", bir, iki);
}
void yazdir(string kelime)
{
stdout.printf("%s\n", kelime);
}
int main()
{
string [] kelimeler = { "Mesire", "Mescit", "Mesela", "Mesafe", "Meşale" };
foreach (string k in kelimeler)
{
var sonuc = turkceSirala(k);
ikiliYazdir(sonuc, k);
}
return 0;
}
Aşağıdaki komut ile uygulamayı derleyebilirsiniz.
valac sirala.vala -o sirala
Uygulamanın çalışıp çalışmadığını sınamak için ilkönce ./sirala şeklinde uygulamanın çıktısına bakınız.
Daha sonra aşağıdaki komut ile çıktıyı kütüğe yazıyoruz.
./sirala > sirala.txt
Gerçekten işlemin başarılı olup olmadığını sınamak için Linux'un sort komutunu kullanıyoruz.
sort sirala.txt
Görülebileceği üzere Türkçe alfabeye göre kelimeleri sıraladı.
160622010706=>Mesafe
160622031224=>Mescit
160622061501=>Mesela
160622122106=>Mesire
160623011506=>Meşale
Geliştirdiğimiz uygulamayı gerçek veriler üzerinde denediğimizde bazı anahtarların uzun, bazılarının kısa olduğunu gördük.
Ayrıca metin içerisinde boşluk, tire ve é gibi özel karakterler vardı.
Başlangıcı aynı ama kısa olan dizgiler sıralamada altta kalıyordu.
Bunun için sirala.vala kütüğünü aşağıdaki gibi değiştirdik.
// valac sirala.vala -o sirala
string sifirlaDoldur (string kelime)
{
if (kelime.length > 40)
return kelime[0:40];
string sonuc = kelime;
int uzunluk = sonuc.length;
string ek = string.nfill(40-uzunluk, '0');
return sonuc + ek;
}
string turkceSirala (string kelime)
{
string sonuc = kelime;
string[] buyukHarfler = {"A", "B", "C", "Ç", "D", "E", "F",
"G", "Ğ", "H", "I", "İ", "J", "K", "L", "M", "N",
"O", "Ö", "P", "R", "S", "Ş", "T", "U", "Ü", "V", "Y", "Z"};
string[] alfabe = {"a", "b", "c", "ç", "d", "e", "f",
"g", "ğ", "h", "ı", "i", "j", "k", "l", "m", "n",
"o", "ö", "p", "r", "s", "ş", "t", "u", "ü", "v", "y", "z"};
string[] diger = {" ", "-", "é" };
string[] digerKarsilik = {"99", "99", "05"};
string[] karsilik = {"01", "02", "03", "04", "05", "06", "07",
"08", "09", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29"};
for (int i = 0; i < alfabe.length; ++i)
{
sonuc = sonuc.replace(alfabe[i], karsilik[i]);
}
for (int i = 0; i < buyukHarfler.length; ++i)
{
sonuc = sonuc.replace(buyukHarfler[i], karsilik[i]);
}
for (int i = 0; i < diger.length; ++i)
{
sonuc = sonuc.replace(diger[i], digerKarsilik[i]);
}
return sifirlaDoldur(sonuc);
}
Uygulamanın çalışma yöntemine bakarsak eğer anahtar 40 karakterden uzunsa kırpıyor.
Eğer kısa ise kalan karakterleri 0'la dolduruyor. Böylece başlangıcı aynı ama kısa metinler sıralamada altta kalmıyor.
Gerçek veriler üzerinde uygulamanın nasıl çalıştığını gösteren bir ekran görüntüsünü aşağıda bulabilirsiniz.

Bu yöntem kullanarak aynı verileri diğer dillerde sıralayacak anahtar da eklenebilir.
Yorumlar