Çözüldü C# Substring Bir Problem

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Alpha Centauri

Megapat
Katılım
25 Şubat 2016
Mesajlar
3.554
Makaleler
4
Çözümler
89
Merhabalar. C#'ta Substring ile çözemediğim bir durum var. Bir programımda yapılan işlemlerin kaydını tutuyorum, belli bir süreden (mesela 1 aydan) daha eski değerleri siliyorum. Ancak enteresan bir durumla karşılaştım, bu durumu yazma şeklimle, farklı kullanmak zorunda olsam dahi Replace gibi basit işlemlerle geçiştirmek kolay ancak neden böyle bir sorun olduğunu merak ediyorum ve anlamak istiyorum.

Yaptığım iş bir metnin başından tarihi çekmek. Mesela şöyle bir değer olsun:
[23.12.2019 22:20:20] Blabla işlemi yapıldı.

Buradan baştaki tarihi çekmek için şöyle bir yol izliyorum:
C#:
string tarih = yazi.Substring(yazi.IndexOf('['), yazi.IndexOf(']'));

Gelelim garip kısma, eğer bu metnin başına başka değerler gelirse aldığım çıktı baştakinden farklı oluyor. Üstelik başında farklı karakterler olduğunda, sadece tarihi yazıp devamına hiç yazı, 1 karakter dahi yazmadıysam "System.ArgumentOutOfRangeException" şeklinde hata alıyorum. (Program her zaman tarihten sonra işlem yazacak olduğundan sıkıntı yok ama dediğim gibi amaç öğrenmek.)

Çıktılar şöyle oluyor:

[23.12.2019 22:20:20] için [23.12.2019 22:20:20

=>[23.12.2019 22:20:20] için [23.12.2019 22:20:20] (Üstelik dediğim gibi sonunda ek bir karakter olmadığında yukarıda belirttiğim şekilde hata alıyorum. Ancak bir üstteki yazım şeklinde sonunda karakter olmasa da hata almıyorum.)

İlk çıktıda veriler:
prblm1.PNG


İkinci çıktıda veriler:
prblm2.PNG


@BilgisayarKurdu
Şimdiden teşekkürler. 🙂
 
Çözüm
Senin en başta paylaştığın kod başta karakter olsun veya olmasın sorunsuz çalışmıyor zaten, hataya düşüyor. Substring nesnelerini Microsoft'un sayfası üzerinden boş bir vaktinde gözden geçirmeni, hangi kodların hangi biçimde yazılması gerektiğini ve ne işe yaradığını öğrenmeni tavsiye ederim. Veritabanı bağlantılı hemen her projede mutlaka ama mutlaka kullandığın kodlar neticede.

Son paylaştığım kod ile başına ne koyarsan koy problem yaşamazsın zaten. Yalnızca 2 adet kesme açma işareti "[" arka arkaya gelirse o veya bu nedenden ötürü, kırpacağı odak şaşırır Substring komutunun :) Standart olarak belli bir kalıp düşüyorsa ilgili değişkene problem olmaz tabi ki.
Substring ile neden uğraşıyorsunuz?

C#:
DateTime Time = DateTime.Parse(tarih);



int Gun = Time.Day;
int Ay = Time.Month;
int Yil = Time.Year.

Buradaki gibi basit ve hızlı bir şekilde kullanabilirsiniz.
String veriler ile bu tür işlemler yapmayın çok gerekmiyor ise, maaliyetlidir. Bellek alanınızı çalar, class olduğundan belleğin Heap bölümünde tutulur bu nedenle Garbage Collection onu bellekten daha geç siler.
 
Substring ile neden uğraşıyorsunuz?

C#:
DateTime Time = DateTime.Parse(tarih);



int Gun = Time.Day;
int Ay = Time.Month;
int Yil = Time.Year.

Buradaki gibi basit ve hızlı bir şekilde kullanabilirsiniz.
String veriler ile bu tür işlemler yapmayın çok gerekmiyor ise, maaliyetlidir. Bellek alanınızı çalar, class olduğundan belleğin Heap bölümünde tutulur bu nedenle Garbage Collection onu bellekten daha geç siler.
Teşekkürler, fakat benim yapmak istediğim o tarihi elde etmek. Yani şöyle bir veriden:
[23.20.2019 22:20:20] Ahmet kişisi C işlemini yaptı.
"23.20.2019 22:20:20" kısmını çekmek benim sıkıntı yaşadığım nokta.

Düzenleme: Veritabanında yapılan işlemleri yanlışlıkla yapılan bir işleme karşı kayıt tutuyorum. Kayıt dosyalarını *.txt* dosyalarında tuttuğum için böyle karmaşık işlere girmek zorunda kaldım. Esasında bunun yerine kullanabileceğim bir başka yöntem varsa hayır diyemem. 🙂
 
Etiketin bana ulaşmadı, aklında bulunsun konu açarken yapılan etiketlerden pek haberdar olamıyoruz, şans eseri gördüm. Aşağıdaki kodu kullanabilirsin. Parantezleri almak istiyor musun istemiyor musun bu arada? Tek haneli gün ve ayları 01 - 09 şeklinde alıyor değil mi bu arada? Bir açayım editörü bakayım.


Bu içerikten;
[23.20.2019 22:20:20] Ahmet kişisi C işlemini yaptı.
Bunu elde etmek istiyorsan. (Tırnaklar dahil değil elbette)
"23.20.2019 22:20:20"

Bu kod işini çözer;
C#:
tarih.Substring((tarih.IndexOf('['))+1, 19);
 
Son düzenleme:
Etiketin bana ulaşmadı, aklında bulunsun konu açarken yapılan etiketlerden pek haberdar olamıyoruz, şans eseri gördüm. Aşağıdaki kodu kullanabilirsin. Parantezleri almak istiyor musun istemiyor musun bu arada? Tek haneli gün ve ayları 01 - 09 şeklinde alıyor değil mi bu arada? Bir açayım editörü bakayım.


Bu içerikten;
[23.20.2019 22:20:20] Ahmet kişisi C işlemini yaptı.
Bunu elde etmek istiyorsan. (Tırnaklar dahil değil elbette)
"23.20.2019 22:20:20"

Bu kod işini çözer;
C#:
tarih.Substring((tarih.IndexOf('['))+1, 19);
Öncelikle çok teşekkürler, bu benim işimi görüyor evet. 🙂
Peki sormak istediğim nokta, üstte olduğu gibi başında karakter olduğu durumda neden bu komut farklı çalışıyor olabilir?
 
Senin en başta paylaştığın kod başta karakter olsun veya olmasın sorunsuz çalışmıyor zaten, hataya düşüyor. Substring nesnelerini Microsoft'un sayfası üzerinden boş bir vaktinde gözden geçirmeni, hangi kodların hangi biçimde yazılması gerektiğini ve ne işe yaradığını öğrenmeni tavsiye ederim. Veritabanı bağlantılı hemen her projede mutlaka ama mutlaka kullandığın kodlar neticede.

Son paylaştığım kod ile başına ne koyarsan koy problem yaşamazsın zaten. Yalnızca 2 adet kesme açma işareti "[" arka arkaya gelirse o veya bu nedenden ötürü, kırpacağı odak şaşırır Substring komutunun :) Standart olarak belli bir kalıp düşüyorsa ilgili değişkene problem olmaz tabi ki.
 
Çözüm
Senin en başta paylaştığın kod başta karakter olsun veya olmasın sorunsuz çalışmıyor zaten, hataya düşüyor. Substring nesnelerini Microsoft'un sayfası üzerinden boş bir vaktinde gözden geçirmeni, hangi kodların hangi biçimde yazılması gerektiğini ve ne işe yaradığını öğrenmeni tavsiye ederim. Veritabanı bağlantılı hemen her projede mutlaka ama mutlaka kullandığın kodlar neticede.

Son paylaştığım kod ile başına ne koyarsan koy problem yaşamazsın zaten. Yalnızca 2 adet kesme açma işareti "[" arka arkaya gelirse o veya bu nedenden ötürü, kırpacağı odak şaşırır Substring komutunun :) Standart olarak belli bir kalıp düşüyorsa ilgili değişkene problem olmaz tabi ki.
Çok teşekkürler. Dediğiniz gibi Microsoft'un Substring sayfasını "detaylıca" inceledikten sonra dank etti. 🙂

Benim gibi takılıp da sonra bu konuyu görenler için:
In other words, the Substring method attempts to extract characters from index startIndex to index startIndex + length - 1.
Bu kısım zaten açıkça gösteriyor metodun nerede başlayıp nerede bittiğini.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Geri
Yukarı