Découper une chaine de caractères

Résolu
cs_Peone Messages postés 16 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 mars 2006 - 9 févr. 2006 à 12:22
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 9 févr. 2006 à 23:37
procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ;
begin
Assert(Assigned(Strings)) ;
Strings.Clear;
Strings.Delimiter := Delimiter;
Strings.DelimitedText := Input;
end;

j'utilise cette procedure pour diviser ma chaine de caractere. Seul probleme, en plus du delimiteur, elle splite la chaine a chaque espace. qu'est ce que je devrait ajouter a ce petit bout de code pour qu'il ne s'occupe plus des espaces

Merci


Peone

15 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 12:54
Salut,
j'ai refait le teste avec comme chaîne :
Split('\', 'je me suis \ trompé \ et c''est'+#13#10+' \ très bête', ts);

et ça fonctionne également

@+
Cirec
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 14:12
ça fonctionne mais j'ai quand même apporté une modification en cas de présence de retour chariot:

procedure Split (const Delimiter: string; Input: string; const Strings: TStrings) ;
var
mot : String;
i,indiceMot : integer;
begin
mot:='';
indiceMot:=1;
for i:=1 to length(Input) do
begin
if (Input[I] = #10) or (Input[I] = #13) Then Input[I] := #0;
if (Input[i]=Delimiter) then
begin
Strings.Add(mot);
indiceMot:=indiceMot+1;
mot:='';
end
else
begin
mot:=mot+Input[i];
end;
end;
Strings.Add(mot);
end;

@+
Cirec
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 23:37
Pas de quoi,
part contre tu peux cliquer sur réponse acceptée vu que le problème est règlé. Merci

@+
Cirec
3
cs_Peone Messages postés 16 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 mars 2006
9 févr. 2006 à 12:48
ok merci bcp, je vais checker ca


Peone
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Peone Messages postés 16 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 mars 2006
9 févr. 2006 à 13:01
Bon ce n'est pas que je suis de mauvaise foi mais je viens de mettre exactement ton code et ca donne tjs la meme chose.

Je t'ai fait un screenshot, regarde par toi meme, c'est exactement ton code

lol, j'en perd mon latin ...


Peone
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 13:20
pas de soucis je te crois, mais dis moi quel version de Delphi tu utilises
ps : l'image ne s'affiche pas chez moi

@+
Cirec
0
cs_Peone Messages postés 16 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 mars 2006
9 févr. 2006 à 13:23
la 7


Peone
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 13:43
Le problème c'est que je n'ai pas D7 j'ai que D4 et D9
et dans D4 il n'y a pas les propriétés Delimiter et DelimitedText
et dans D9 ça fonctionne
donc si une âme charitable pourrait faire le teste ce serait sympa

@+
Cirec
0
cs_Peone Messages postés 16 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 mars 2006
9 févr. 2006 à 13:54
j'en ai marre d'essayer de decouvrir l'electricite en ameliorant les bougies, g donc coder ma propre fonction split (qui marche) qu'est-ce que tu en dis?

procedure TForm1.Button1Click(Sender: TObject);


Var ts : TStrings;


procedure Split (const Delimiter: string; Input: string; const Strings: TStrings) ;
var
mot : String;
i,indiceMot : integer;
begin
mot:='';
indiceMot:=1;
for i:=1 to length(Input) do
begin
if (Input[i]=Delimiter) then
begin
Strings.Add(mot);
indiceMot:=indiceMot+1;
mot:='';
end
else
begin
mot:=mot+Input[i];
end;
end;
Strings.Add(mot);
end;


begin
ts := TStringList.Create;
Split('\','\je me suis \ trompé \ et c''est \ très bête',ts);
Memo1.Lines.AddStrings(ts);
ts.free;
end;


Peone
0
fdb592 Messages postés 3 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 9 février 2006
9 févr. 2006 à 15:26
bonjour,
je comprends le reotur de chariot mais à quoi ça te sert de le remplacer par le caractère #0 ?
quel est ce caractère ?

Alex.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 15:28
ça permet d'annuler le caractère c'est comme si on l'avais supprimer

@+
Cirec
0
fdb592 Messages postés 3 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 9 février 2006
9 févr. 2006 à 15:32
merci du renseignement :)
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 22:53
Salut,

au passage je re-post le même code légèrement optimisé :

Procedure Split(Const Delimiter: String; Input: String; Const Strings:
TStrings);
Var
mot : String;
i : integer;
Begin
mot := EmptyStr;
For i : = 1 To length(Input) Do
Begin
If (Input[I] = #10) Or (Input[I] = #13) Then Input[I] := #0;
If (Input[I] = Delimiter) Then
Begin
Strings.Add(mot);
mot := EmptyStr;
End
Else
mot : = mot + Input[I];
End;
Strings.Add(mot);
End;

@+
Cirec
0
cs_Peone Messages postés 16 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 mars 2006
9 févr. 2006 à 23:01
Merci c cool de m'avoir file un coup de main

A la revoyure


Peone
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 12:45
Salut,
j'ai fait le teste et ça fonctionne très bien tel quel :

procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ;
begin
Assert(Assigned(Strings)) ;
Strings.Clear;
Strings.Delimiter := Delimiter;
Strings.DelimitedText := Input;
end ;


procedure TForm1.Button3Click(Sender: TObject);
Var ts : TStrings;
begin
ts : = TStringList.Create;
Split('\', 'je me suis \ trompé \ et c''est \ très bête', ts);
Memo1.Lines.AddStrings(ts);
ts.free
end;


Le problème doit se situer ailleurs tu as certainement des retours chariots dans la chaîne "Input"

@+
Cirec
-2
Rejoignez-nous