Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C# .NET Regular Expression Sorunsalı


Thalion

Öne çıkan mesajlar

Selamlar, elimde parse etmem gereken bir log file var, parser'ı yazıyorumda istemediğim bir takım kısımları çıkartmak için regular expression'ları kullanmam gerekiyor, programlama konusunda pek parlak değilim, özellikle de regular expression'lar konusunda hiç parlak değilim, bayaa bir döküman okudum ama kafam iice daaldı,

14.11.04-10:32:33,14.11.04-10:32:46,40,[0001:01]05324911659,0101,13,0

log file'ın formatı bu

14.11.04 ---> start date
10:32:33 ---> start time
14.11.04 ---> stop date
10.32.46 ---> stop time
05324911659 ---> called number
13 ---> duration

log file'dan almak istediklerim bunlar, ama txt. file'ı alırken bunları ayıracak expression'ı yaamadım bir türlü..

yardım edebilecek birileri varsa sevinirim..[signature][hline]
MS / Linux System Admin, Backbone Administrator, VoIP Technician, NooBie C# Developer , ex pisikopat
MCSE,MCSA,MCDBA,CCNA
icq : 566413 msn : [email protected]
There is no darkness, only ignorance..

Link to comment
Sosyal ağlarda paylaş

dtTable.Columns.Add("StartDate", typeof(string));
dtTable.Columns.Add("StartTime", typeof(string));
dtTable.Columns.Add("StopDate", typeof(string));
dtTable.Columns.Add("StopTime", typeof(string));
dtTable.Columns.Add("CalledNumber", typeof(string));
dtTable.Columns.Add("Duration", typeof(string));



//Set Regular Expression

//If you were parsing a standard comma delimited text file
//you would use this expression:


Regex r = new Regex(",(?=([^"]*"[^"]*")*(?![^"]*"))");


ahanda bu da örnek aldığım kod, bold olan kısımda amca kendi log file'ı için bir regular expression hazırlamış... bende benimkine uyarlıyabilirsem sorunum kalmayacak..[signature][hline]
MS / Linux System Admin, Backbone Administrator, VoIP Technician, NooBie C# Developer , ex pisikopat
MCSE,MCSA,MCDBA,CCNA
icq : 566413 msn : [email protected]
There is no darkness, only ignorance..


[Bu mesaj Thalion tarafından 20 Kasım 2004 18:05 tarihinde değiştirilmiştir]
Link to comment
Sosyal ağlarda paylaş

walla .NET te hic regex kullanmadım ama sabahtan beri compiler ödeviyle ugrasan bi insan olarak pek sevmiyorum :p

simdi sen adamın verdigi regexi yazmıssın da, ben regexler bu sekilde kullanılıyor mu bilmiyorum, kullandıgınız bi regex sonucunda genelde gelen inputu ya accept ya da reject edersiniz..atıyorum mesela customize bi numberbox yazıosunuz, adam harf giremicek veya "." dan sonra max 2 basamak gircek felan. gelen input formata uyuyorsa kabul ediyorsunuz yoksa reject vs..

bu sekilde bi stringin işinize gelen kısmını kırpmak icin kullanıldıgını görmedim..adamın örnegini daha acık yazarsan belki yardımcı olabilirim.

öte yandan her zaman aldıgın input bu formattaysa regex falan kasmana gerek pek yok. substring leri alarak veya cesitli split fonksiyonları kullanarak istedigin seyleri elde edebilirsin gibi gözüküyor..
Link to comment
Sosyal ağlarda paylaş

log formatım sabit yani hep bu şekilde olacak, bende daha çoook yeniyim programlama konusunda, o nedenle kod sitelerine örnek kod'lar için bakarak bişiler bulmaya çalışıyorum.

regex ile yapılan en kolay örnekti gördüklerim arasında, ama tabiiki başka yollarada açığım, substring ile bölmeyi beceremedim ( benim kabızlığım :P )

regex'e takılmamın nedeni de daha önce birlikte çalıştığım elemanın perl script'ler ile hazırladığı parser'larda regex'leri kullanarak çok güçlü bir şekilde gb'lerce log'u kasmadan parse ettiğini görmem, o nedenle regex'lere taktım birazda, aslında SQL'e direk bulk insert'de edebiliyorum ama sadece ayıklamam gereken 1-2 yer kalıyor.

bakayım 1 for döngüsü ile line by line substring'lere ayırıp denerim artık, regex'in tek artısı bana bulk olarak yapmasıydı ama çok da dert deeel, log file'larım o kadarda büyük deel günlük max 100k satır..[signature][hline]
MS / Linux System Admin, Backbone Administrator, VoIP Technician, NooBie C# Developer , ex pisikopat
MCSE,MCSA,MCDBA,CCNA
icq : 566413 msn : [email protected]
There is no darkness, only ignorance..

Link to comment
Sosyal ağlarda paylaş

said:

string Source="14.11.04-10:32:33,14.11.04-10:32:46,40,[0001:01]05324911659,0101,13,0";
string startDate=Source.subStr(0,8);
string startTime=Source.subStr(9,8);
string stopDate=Source.subStr(18,8);
string stopTime=Source.subStr(27,8);


gibi kullanabilirsin.
p.s subStr tam olarak methodun adı olmayabilir..
Link to comment
Sosyal ağlarda paylaş

said:
Thalion, 20 Kasım 2004 18:02 tarihinde demiş ki:
14.11.04-10:32:33,14.11.04-10:32:46,40,[0001:01]05324911659,0101,13,0

14.11.04 ---> start date
10:32:33 ---> start time
14.11.04 ---> stop date
10.32.46 ---> stop time
05324911659 ---> called number
13 ---> duration
öncelikle kim bu şekilde log tutuyorsa büyük bir hata yapıyor. , gibi bir splitter pek uygun değil. ama değiştiremeyeceğimiz varsayıyorum..

string startdate, starttime, stopdate, stoptime, number, duration;

// stream işlemleri

string tey = log.ReadLine(); // bir satırın seçildiğini varsayıyorum.
string[] parca = tey.Split( "," );

startdate = parca[0].Substring( 0, parca[0].IndexOf( "-" ) );
starttime = parca[0].Substring( "-" );
stopdate = parca[1].Substring( 0, parca[1].IndexOf( "-" ) );
stoptime = parca[1].Substring( "-" );
number = parca[2].Substring( "]" );
duration = parca[4];


//sonradan gördüm, eğer uzunluklar sabitse cedayın çözümündeki gibi direkt indeksleri kullanabilirsin. ve eğer yaptığın iş memory kıtlığında yapılacaksa bu şekilde bellek tasarrufu yapabilirsin. ( gerçi yapsan yapsan 2 mb tasarruf yaparsın ya :D )

[signature][hline]en ince yerim bileğim..!?!

[Bu mesaj Mum_Chamber tarafından 20 Kasım 2004 19:53 tarihinde değiştirilmiştir]

[Bu mesaj Mum_Chamber tarafından 20 Kasım 2004 19:55 tarihinde değiştirilmiştir]
Link to comment
Sosyal ağlarda paylaş

Teşekkürler Mum ve Ceday, sonradan farkettim duration kısmındaki değer 1-3 digit arasında oynıyor o nedenle subsplit'i direk digit'lere göre yaptığım zaman patlıyorum, Mum'un çözümü sorunu halletmemi sağladı..[signature][hline]
MS / Linux System Admin, Backbone Administrator, VoIP Technician, NooBie C# Developer , ex pisikopat
MCSE,MCSA,MCDBA,CCNA
icq : 566413 msn : [email protected]
There is no darkness, only ignorance..

Link to comment
Sosyal ağlarda paylaş

bu arada regex kısmını arastırdın mı?
mesela senin dedigin gibi perl'de felan regexler epey kullanılıyor ancak onda da mesela 3-4 regex yazıosunuz daha sonra regex1 e uyuyosa sunu yap, suna uyuyosa bunu yap gibi seklinde parse ediosunuz..

bi stringi kırpma seklinde bi kullanımı yok sanırım ?
Link to comment
Sosyal ağlarda paylaş

Elimde bir kod örneği vardı, adam ciddi karmaşık bir log file'ı regex ile çok kolay bir şekilde kırpıp dataset'e atmıştı ama adamın regex'ini anlamadığım ve bende adam gibi bir regex hazırlayamadığım için split'i tercih ettim, yoksa MSDN'de bile parser için en iyi yöntemin regex olduu söleniyor.

http://www.regular-expressions.info/

burada regular expression'lar ile ilgili bayaa bişi anlatıyor ama C#'ta kullandığım zaman unrecognized escape sequence mı ne veriyor.

split ederek grid'e attım ama nedenini anlamadığım bir şekilde sql'e yazdırmaya çalıştığım zaman her seferinde hata alıyorum, ben StartDate StopDate vs. field'lerini string olarak atmaya çalışsam bile C# invalid data/time format exception'ı atıyor. bir şekilde halledecem bakalım, muhtemelen acemiliğimden biryerlerde hata yapıyorum.[signature][hline]
MS / Linux System Admin, Backbone Administrator, VoIP Technician, NooBie C# Developer , ex pisikopat
MCSE,MCSA,MCDBA,CCNA
icq : 566413 msn : [email protected]
There is no darkness, only ignorance..

Link to comment
Sosyal ağlarda paylaş

bi kurcalıyım, şu anda ftp'den logları otomatik çekme servisi, cofig'lerinin xml'leri ve timer'ları ile cebelleşiyorum :) data'lar ile uğraşmak biraz baydı da.[signature][hline]
MS / Linux System Admin, Backbone Administrator, VoIP Technician, NooBie C# Developer , ex pisikopat
MCSE,MCSA,MCDBA,CCNA
icq : 566413 msn : [email protected]
There is no darkness, only ignorance..

Link to comment
Sosyal ağlarda paylaş

Abi eğer C# ile çalışma zorunluluğun yoksa Perl ile bişeyler yapmaya çalış derim. Çünkü bahsettiğin şeyleri yapmak için tasarlanmış bir betik dili Perl.[signature][hline]Q: How many IBM cpu's does it take to do a logical right shift?
A: 33. 1 to hold the bits and 32 to push the register.
Link to comment
Sosyal ağlarda paylaş

hehe sadece parser için kasmıyorum valla can sıkıntısından network babalar gibi işliyo bana da yapacak ş kalmıyo :P bende kendime iş çıkartıyorum yoksa parser'ım var zaten derdim kendikimi yazmak ;)

C# çünkü buradaki programcılarım .netci, baymaz'da gekiştirirsem kendimi önceden yazılmış olan bazı programlarda değişiklikler ve eklemeler yapmayı planlıyorum da.. ( ölme eşşeem ölme )[signature][hline]
MS / Linux System Admin, Backbone Administrator, VoIP Technician, NooBie C# Developer , ex pisikopat
MCSE,MCSA,MCDBA,CCNA
icq : 566413 msn : [email protected]
There is no darkness, only ignorance..

Link to comment
Sosyal ağlarda paylaş

×
  • Yeni Oluştur...