Poslao: 28 Sep 2009 21:41
|
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!
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 28 Sep 2009 21:53
|
offline
- bobby
- Administrator
- 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;
|
|
|
|
Poslao: 28 Sep 2009 22:55
|
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 pa kako da resim jos ovo
|
|
|
|
Poslao: 28 Sep 2009 23:00
|
offline
- bobby
- Administrator
- 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?
|
|
|
|
Poslao: 28 Sep 2009 23:09
|
offline
- l0s7
- Novi MyCity građanin
- Pridružio: 04 Feb 2009
- Poruke: 11
|
jao izvini nisam stavio i :=0; na pocetku definitivno sam blokirao ;d
radi odlicno! hvala ti
|
|
|
|
Poslao: 28 Sep 2009 23:12
|
offline
- bobby
- Administrator
- 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;
|
|
|
|
Poslao: 28 Sep 2009 23:21
|
offline
- l0s7
- Novi MyCity građanin
- Pridružio: 04 Feb 2009
- Poruke: 11
|
i sad postajem malo bezobrazan
plz, reci mi jos samo ovo
kako da isece string ako sadrzi text 'cnn'
znaci aca-zCNN da ostavi samo aca-z
hvala 100x
|
|
|
|
Poslao: 28 Sep 2009 23:26
|
offline
- bobby
- Administrator
- 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
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
Dopuna: 28 Sep 2009 23:26
l0s7 ::jao izvini nisam stavio i :=0; na pocetku definitivno sam blokirao ;d
radi odlicno! hvala ti
Zar ti Delphi nije prijavio Warning da ti varijabla nije inicijalizovana?
|
|
|
|
Poslao: 28 Sep 2009 23:57
|
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
Hvala ti puno na brzim i kvalitetnim odgovorima. Svaka cast
|
|
|
|