TStringList - kako da...

TStringList - kako da...

offline
  • l0s7 
  • Novi MyCity građanin
  • Pridružio: 04 Feb 2009
  • Poruke: 11

Kako iz TStringList da izbrisem svaku liniju koja pocinje sa nekim brojem?

i kako da izbrisem samo jedan deo iz svake linije
npr 'pera-pera.smx' da ostane samo 'pera-pera' a ovo .smx da isecem

izvinjavam se na ovako pocetnickom pitanju, ali nesto neumem da resim ovo...

Hvala!

GUZ - Glavom U Zid



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Pretpostavimo da je sl ime tvoje string liste i da broj -1 ne moze da se pojavi na pocetku linije (da bi smo mi mogli da ga koristimo za nase potrebe u kodu)
var   i: integer;   s: string;   b: char; begin   i :=0;   while i < sl.count do   begin     s := sl[i];     b := s[1];     if StrToIntDef(b, -1) <> -1 then       sl.delete(i)     else inc(i);   end; end;



offline
  • l0s7 
  • Novi MyCity građanin
  • Pridružio: 04 Feb 2009
  • Poruke: 11

ovako mi uklanja svaki string koji pocinje od 1 do 9, ali ne i sa 0
nesto sam blokirao Smile pa kako da resim jos ovo Wink

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

StrToIntDef(string, x) je naredba koja neki string (koji je broj u vidu stringa) konvertuje u broj (integer).
Ukoliko dati string nije bio broj, onda ce rezultat biti x

Znaci, moja gornja funkcija treba da detektuje sve brojeve, ili da kao rezultat da -1 ukoliko je na pocetku linije slovo.
Onda imas uslov da se linija brise ukoliko rezultat funkcije nije bio -1 (nije bilo slovo, znaci da je bio broj), ili pak da predje na sledecu liniju (inc(i)).


Sada mi kazi, je li ni sa mojim resenjem nece da brise one koji pocinju nulom, ili to nece sa tvojim prepravljenim kodom?

offline
  • l0s7 
  • Novi MyCity građanin
  • Pridružio: 04 Feb 2009
  • Poruke: 11

jao izvini nisam stavio i :=0; na pocetku GUZ - Glavom U Zid definitivno sam blokirao ;d
radi odlicno! hvala ti

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Jesi li iskljucio sve ostale mogucnosti greske?
GOrnji kod uzima prvi karakter iz neke linije, pa ako ti ta linija sa nulom slucajno pocinje spaceom (prazno polje), onda nece da je detektuje.

Gornji kod bi trebao da radi i sa nulom (pisao sam iz glave, a ne mogu sada da proverim na svom kompu).
Meni jedino na pamet padaju te eventualne greske kod tvojih podataka nad kojima vrsis proveru.

Probaj sa sledecom izmenom i vidi da li ce onda da radi:
var   i: integer;   s: string;   b: char; begin   i :=0;   while i < sl.count do   begin     s := trim(sl[i]);     b := s[1];     if StrToIntDef(b, -1) <> -1 then       sl.delete(i)     else inc(i);   end; end;

offline
  • l0s7 
  • Novi MyCity građanin
  • Pridružio: 04 Feb 2009
  • Poruke: 11

i sad postajem malo bezobrazan Smile
plz, reci mi jos samo ovo
kako da isece string ako sadrzi text 'cnn'
znaci aca-zCNN da ostavi samo aca-z

hvala 100x

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Napisano: 28 Sep 2009 23:23

Kod izbacivanja dela stringa treba prvo da znas u kojim sve pozicijama u orginalnom stringu moze da se nadje taj tvoj pod-string.

Za detekciju pozicije nekog substringa imas naredbu POS:

x := pos('cnn', 'aca-zcnn');

Ovo ce ti kao rezultat dati 6, tj. poziciju na kojoj pocinje 'cnn'.

Onda ti treba naredba COPY da bi iz originalnog string iskopirao samo ono sto ti treba:

a := copy(original, pocetak, duzina);

primer:

a := copy('aca-zcnn', 1, 5);

ili iskombinovano sa POS:

a := copy(moj_string, 1, pos('cnn', moj_string) -1);


e, sve ovo gore funkcionise samo ukoliko ti treba iseci kraj nekog stringa. Ukoliko treba iseci nesto iz sredine, onda se malo komplikuje.
Drugi problem bi bio recimo string "acacnn-zcnn" jer bi tu seklo vec kod prvog stringa (a tebi treba recimo da iseces samo onaj zadnji "cnn").

Parseri su malko komplikovani, ali ne i nemoguci ukoliko razmisljas o svim mogucim situacijama koje mogu da te snadju Smile
Ja sam godinama pravio parsere koji su iz raznih logova izvlacili podatke da bi od njih pravili tabele, tako da mi je ovo maltene postala uza specijalnost Mr. Green

Dopuna: 28 Sep 2009 23:26

l0s7 ::jao izvini nisam stavio i :=0; na pocetku GUZ - Glavom U Zid definitivno sam blokirao ;d
radi odlicno! hvala ti

Zar ti Delphi nije prijavio Warning da ti varijabla nije inicijalizovana?

offline
  • l0s7 
  • Novi MyCity građanin
  • Pridružio: 04 Feb 2009
  • Poruke: 11

a := copy(moj_string, 1, pos('cnn', moj_string) -1);
to je to Smile

Hvala ti puno na brzim i kvalitetnim odgovorima. Svaka cast

Ziveli

Ko je trenutno na forumu
 

Ukupno su 872 korisnika na forumu :: 13 registrovanih, 2 sakrivenih i 857 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: cvrle312, DH, havoc995, Koridor, mikki jons, milenko crazy north, milos.cbr, moldway, MrNo, novidan, Romibrat, Žoržo, šumar bk2