Fonction split

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 851 fois - Téléchargée 17 fois

Contenu du snippet

Du fait que les fonctions Split que j'ai trouvé sur le web ne marchait pas correctement, j'ai décidé d'en créer une répondant à mes besoins.
Voici celle-ci et un exemple type :

Source / Exemple :


Procedure Split(Var retour : Array Of String; Chaine : String; Car : Char);
Var
Compteur : Integer;
PosUne : Integer;
PosDeux : Integer;
Temp : String;

Begin
PosUne := 1;
PosDeux := Pos(Car,Chaine);

Compteur := 0;

While ((PosDeux <> 0) and (Compteur <> Length(Retour))) Do
Begin
  Retour[Compteur] := Copy(Chaine, PosUne, (PosDeux - PosUne));
  If Length(Retour[Compteur]) = 0 then Retour[Compteur] := ' ';
  Temp := Copy(Chaine, PosDeux + 1, (Length(Chaine) - PosDeux));
  Chaine := Temp;
  PosDeux := Pos(Car,Chaine);
  Compteur := Compteur + 1;
End;

If Compteur <> Length(Retour) Then
Begin
 Retour[Compteur] := Copy(Chaine, PosUne, (Length(Chaine) - (PosUne - 1 )));
 If Length(Retour[Compteur]) = 0 then Retour[Compteur] := ' ';
End;

End;

Procedure TForm1.Button1Click(Sender: TObject);
Var
  Mon_Tableau : array[1..10] of string;
  Ma_Chaine : String;
  Mon_Delimiteur : Char;
  i : Integer;

Begin
  // On peut remarquer que Ma_Chaine comporte des chaines vides entre le délimiteur //
  Ma_Chaine := 'test1;;test3;test4;test5;test6;test7;;test9;';
  Mon_Delimiteur := ';';

  Split(Mon_Tableau, Ma_Chaine, Mon_Delimiteur);

  For i:= 1 to 10 Do ShowMessage(Mon_Tableau[i]);
End;

Conclusion :


Les résultats obtenus sont:
i = 1 => 'test1'
i = 2 => ' '
i = 3 => 'test3'
i = 4 => 'test4'
i = 5 => 'test5'
i = 6 => 'test6'
i = 7 => 'test7'
i = 8 => ' '
i = 9 => 'test9'
i =10 => ' '

A voir également

Ajouter un commentaire

Commentaires

Balthus14
Messages postés
1
Date d'inscription
vendredi 30 mai 2008
Statut
Membre
Dernière intervention
24 décembre 2010

Vieux post mais si cela peut aider !

voilà ma solution pour éviter la prise en considération du caractère espace par fonction "TSrings.DelimitedText"

Procedure ScinderPerso(S: string; const Delimiteur: char;Strings : TStrings);
begin
if assigned(Strings) then
begin
while Pos(DElimiteur,S)<>0 do
begin
Strings.add(copy(S,1,pred(Pos(Delimiteur,S))));
delete(S,1,Pos(Delimiteur,S));
end;
if S<>'' then Strings.add(S);
end;
end;
crackspider7676
Messages postés
9
Date d'inscription
vendredi 9 février 2007
Statut
Membre
Dernière intervention
28 février 2008

Oui, c'est vrai mais dans mon cas, cela m'arrangeait étant donné que la chaine à splitter contient toujours 10 champs.
FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Déclarer la longueur du tableau limite sérieusement l'intérêt de cette source. Il fallait passer un tableau dynamique en paramètre (type formel).
nethacker
Messages postés
288
Date d'inscription
mardi 2 mai 2006
Statut
Membre
Dernière intervention
12 octobre 2011

Y'a aussi les fonctions Rexx !
crackspider7676
Messages postés
9
Date d'inscription
vendredi 9 février 2007
Statut
Membre
Dernière intervention
28 février 2008

j'avais trouver un code utilisant le type TStringList sur http://delphi.about.com/cs/adptips2002/a/bltip1102_5.htm et dans certains cas j'étais confronté à une erreur.
PS: au bout de 200 split, il y avait parfois un décallage => Bizarre.
Merci quand même!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.