Fonction split

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 049 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
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;
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.
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).
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 !
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!
Afficher les 7 commentaires

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.