Newsgroup: it.comp.lang.delphi
Titolo: Substringhe da una stringa delimitata..

Ho una stringa nel formato :
aaaaaaaaa;bbbbb;cccccc
con lunghezze di a,b, e c variabili. Esiste qualcosa che mi ridia le 3
substringhe sapendo che sono tra loro divise da un delimitatore particolare
??
una funzione come il decodedate..
omerosx

hai gia visto nella guida di delphi l'elenco "string handling routines"?
Bye
A

> hai gia visto nella guida di delphi l'elenco "string handling routines"?
ho dato un occhiata, ma la mia e un po' troppo personalizzata.. comunque
l'ho risolta con un vecchio caro for
:)
omerosx


Se hai D7 (forse funziona anche in D6, non ricordo) puoi usare
una TStringList.
Esempio:
var
 a : tstringlist;
begin
 a := TStringList.Create;
 with a do
 begin
  Delimiter := ';' ;
  DelimitedText := 'aaaaaaaaa;bbbbb;cccccc';
 end;
ecc...
Ora in a.Strings[Indice] hai ognuna delle sottostringhe.
Molto piu' semplice e OO.
Ciao.
--
ACSH
[D4]
---------------------------
Chi fa da se'
fatica il doppio

 substringhe sapendo che sono tra loro divise da un delimitatore
particolare
Ho ripescato questa funzione che ho scritto chissà quando ma che continuo ad
usare......
Dunque....
Passata una stringa S, definito l'eventuale delimitatore di stringa nel caso
in cui è diverso da " ' " (apice) e definito l'eventuale delimitatore di
valori nel caso in cui è diverso da " , " (virgola) la funzione ritorna il
primo elemento. In più taglia dalla variabile S l'elemento tornato (è
passata per indirizzo e non per valore).
function GetFirstString(var S: string; DelimChar: Char = ''''; SepChar: Char
= ','): string;
var
  I: Integer;
  Opened: Boolean;
begin
  if S = '' then Exit;
  Result := '';
  I := 1;
  Opened := False;
  while ((S[I] <> SepChar) or (Opened)) and (I <= Length(S)) do
  begin
    if S[I] = DelimChar then Opened := not Opened;
    Result := Result + S[I];
    Inc(I);
  end;
  if I <= Length(S) then
    Delete(S, 1, Length(Result) + 1)
  else
    S := '';
end;
Esempio:
...
var
  AString : string;
begin
...
      S := FieldsName; // supponiamo che FieldsName sia uguale a    123,
'Acqua', 1978, 'mi sento solo, mi incontro con Delphi!'
      while S <> '' do
      begin
       AString := Trim(GetFirstString(S)); // Al primo loop AString = 123 ed
S = 'Acqua', 1978, 'mi sento solo, mi incontro con Delphi!'
        // Qui faccio quello che mi pare con i singoli elementi uno alla
volta finchè S = ''
      end;
...
end;
In un loop mi passo tutti gli elementi, inoltre controllo che non vengano
prese in considerazione quelle stringhe che contencono delle virgole in
quanto fanno parte "dell'elemento".....
1° Loop:  AString = 123 ed S = 'Acqua', 1978, 'mi sento solo, mi incontro
con Delphi!'
2° Loop:  AString = 'Acqua' ed S = 1978, 'mi sento solo, mi incontro con
Delphi!'
3° Loop:  AString = 1978 ed S = 'mi sento solo, mi incontro con Delphi!'
4° Loop:  AString = 'mi sento solo, mi incontro con Delphi!' ed S = ''
Uscita dal loop...
Acqua

 quanto fanno parte "dell'elemento".....
Chiarisco quello che avevo intenzione di dire :((((((
Nel caso in cui all'interno di una stringa è presente un carattere uguale al
separatore degli elementi questo benedetto separatore non viene preso in
considerazione (aaaahhhhh)
123, 'Acqua', 1978, 'mi sento solo, mi incontro con Delphi!'
Qui gli elementi tirati fuori dalla funzione sono 4 e non 5... ecco perchè
preferisco delimitare sempre le stringhe. Perchè il delimitatore potrebbe
trovarsi anche all'interno di qualche stringa e in un caso del genere
andrebbe a male l'estrazione.
Acqua

è proprio quello che cercavo, ma c'è un problema:
se la stringa è 'aaaaaa aaaa;bbbbb bbb;cccccccc' come vettore lui si carica
a.Strings[0] = aaaaaa
a.Strings[1] = aaaa
a.Strings[2] = bbbbb
a.Strings[3] = bbb
a.Strings[4] = ccccccccc
cioè considera lo spazio come ulteriore delimitatore..
al momento non ho fatto altre prove, ma la notte porterà forse consiglio
;) comunque OTTIMA SOLUZIONE
omerosx

giusto... comunque la soluzione di ACSH perlomeno per il mio problema è
veramento ok .. con 2 righe di codice.
ciao e grazie
omerosx