krole57
Messages postés5Date d'inscriptionmercredi 14 juin 2006StatutMembreDernière intervention16 juin 2006
-
14 juin 2006 à 12:08
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 2009
-
16 juin 2006 à 23:20
bonjour voila je dois lister tout les mots d'une phrase. Ils peuvent être séparer d'espace de point de virgule...
procedure TForm3.decoupe (chaine : String);
var i:integer;
begin
for i:=1 to Length(chaine) do
if (chaine[i] = ',') or (chaine[i] = '''') or (chaine[i] = ':') or (chaine[i] = '?') or (chaine[i] = '.')or (chaine[i] = ';') or (chaine[i] = '!') or (chaine[i] = '-') then chaine[i] := ' ';
while Pos(' ', chaine) > 0 do Delete(chaine, Pos(' ', chaine), 1);
while chaine[1] = ' ' do Delete(chaine, 1, 1);
while chaine[Length(chaine)] = ' ' do Delete(chaine, Length(chaine), 1);
while Pos(' ',chaine)>0 do
end;
}
j'ai deja quelque chose pour enlever les virgule.. pour qu'il ne reste plus que des espaces mais après je sé pas merci d'ance
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 14 juin 2006 à 12:32
Bonjour,
Je dois être mal réveiller moi...
Déjà, qu'on se comprenne. Pour moi, lister les mots d'uen phrases, peut
importe les séaprateurs, cela revient à générer une liste de chaînes à
partir d'une seul chaîne.
Donc je ne comprend pas pourquoi tu supprime les séparateurs de mots,
alors que tu en a besoin pour savoir où ils sont, justement. Faut dire
que je comprend pas du tout la cohérence de ton code...
J'aurais plutôt vu quelque chose de ce style :
function TForm3.decoupe (chaine : String): TStrings;
var
i, j: Integer;
begin
Result:= TStringList.Create;
j:= 0;
Result.Add('');
//Il me semble que les chaîne sont indicée à partir de zéro. A vérifier.
for i:= 0 to Length(chaine) - 1 do
if (chaine[i] = ',') or (chaine[i] = '''') or (chaine[i] = ':') or
(chaine[i] = '?') or (chaine[i] = '.')or (chaine[i] = ';') or
(chaine[i] = '!') or (chaine[i] = '-') then
begin
//On passe au mot suivant:
j:= j + 1;
Result.Add('');
end
else
begin
//On met la lettre au bout du mot courant
Result[j]:= Result[j] + chaine[i];
end;
//On supprime le dernier mot s'il est vide
if Result[j] = '' then Result.Delete(0);
end;
Code pas testé et comportant très certainement des erreurs. Peut pas tester, désolé.
krole57
Messages postés5Date d'inscriptionmercredi 14 juin 2006StatutMembreDernière intervention16 juin 2006 14 juin 2006 à 12:42
en fait c'est je dois justement à partir d'un fichier texte créer une stringlist et ensuite avoir la liste de tout les mots qui seront mis dans une table par la suite, j'ai mi les séparateurs des espaces pour pouvoir récuperer tout les mots en fait
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 14 juin 2006 à 13:25
Ta stringlist a une méthode LoadFromFile donc pas de souci pour la récupération.
Ensuite, suffit de boucler dessus.
Tu n'est pas forcer de parcourir tout une première fois pour remplacer les virgules etc par des espaces.
function TForm3.decoupe (contenufichier : StringList): TStringList;
var
i, j, k: Integer;
begin
Result:= TStringList.Create;
j:= 0;
for k:= 0 to Length(contenufichier) - 1 do
begin
Result.Add('');
//Il me semble que les chaîne sont indicée à partir de zéro. A vérifier.
for i:= 0 to Length(contenufichier[k]) - 1 do
if (contenufichier[k][i] = ',') or (contenufichier[k][i] = '''') or (contenufichier[k][i] = ':') or
(contenufichier[k][i] = '?') or (contenufichier[k][i] = '.')or (contenufichier[k][i] = ';') or
(contenufichier[k][i] = '!') or (contenufichier[k][i] = '-') then
begin
//On passe au mot suivant:
j:= j + 1;
Result.Add('');
end
else
begin
//On met la lettre au bout du mot courant
Result[j]:= Result[j] + contenufichier[k][i];
end;
//On supprime le dernier mot s'il est vide
if Result[j] = '' then Result.Delete(0);
end;
end;
Je n'ai jamais utilisé la notation [k][i], je sais pas du tout si c'est
valide. Si ça marche pas, tu peux éventuellement récupérer la chaîne de
la liste dans une chaîne indépendante.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 15 juin 2006 à 12:36
Je n'ai pas Delphi sous la main. Toi par contre, si tu tapes CommaText,
que tu mets le curseur dedans et que tu appuie sur F1, tu devrait
tomber sur l'aide de celle-ci.
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 15 juin 2006 à 13:44
Ben Rt, c'est exactement ca : quand tu copies un string vers CommaText, il est automatiquement splitté en sous-chaines, selon les virgules.( Vachement pratique pour choppé des messages GPS, mais je m'égare...)
Donc en gros, pour remplacer tout les espaces par une virgule, un coup de :
Tmp:= StringReplace(MaString,'space',',',[rfReplaceAll,rfIgnoreCase]);
(remplacer space par un espace... sinon ca me fait un retour à la ligne, tss tss tss)
pis pareil avec ce que tu considère comme séparateur, etc etc etc
Et enfin
MaStringlist.CommaText: = Tmp;
et vlan, ton texte est entièrement splitté, et tu accedes à chaque mot par :
MaStringlist.Strings[i] i dans [0..MaStringlist.Count-1]
krole57
Messages postés5Date d'inscriptionmercredi 14 juin 2006StatutMembreDernière intervention16 juin 2006 15 juin 2006 à 14:54
donc si j'ai bien compris pour untiliser commatext il faut que ma phrase contienne que des virgules entre chaque mot. et si jamais ils y a deux fois le meme mot qu'est ce q ca fé????
sachant que moi je le veut sans doublon....dans ma stringlist
et donc ce code marcherai??
function TForm3.decoupe (contenufichier : StringList): TStringList; // le contenu fichier serait les lignes de ma Tstringlist du texte
listemot:=TStringList.Create;
for i:=1 to Length(chaine) do
if (chaine[i] = ' ') or (chaine[i] = '''') or (chaine[i] = ':') or (chaine[i] = '?') or (chaine[i] = '.')or (chaine[i] = ';') or (chaine[i] = '!') or (chaine[i] = '-') then chaine[i] := ',';
while chaine[1] = ', ' do Delete(chaine, 1, 1);
while chaine[Length(chaine)] = ', ' do Delete(chaine, Length(chaine), 1);
Tmp:=StringReplace(chaine,'space',',',[rfReplaceAll,rfIgnoreCase]);
listemot.CommaText:= Tmp;
Emandhal
Messages postés194Date d'inscriptiondimanche 2 mars 2003StatutMembreDernière intervention10 octobre 20063 15 juin 2006 à 15:52
if (chaine[i] = ' ') or (chaine[i] = '''') or (chaine[i] = ':') or (chaine[i] = '?') or (chaine[i] = '.')or (chaine[i] = ';') or (chaine[i] = '!') or (chaine[i] = '-') then chaine[i] := ',';
Ca peut etre remplacé par :
If chaine[i] in [' ', '''', ':', '?', '.', ';', '!', '-'] Then chaine[i] := ',';
Plus simple, plus lisible ^^
Tout problème a sa solution... Mais en général, celle que l'on trouve n'est jamais la bonne...
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 15 juin 2006 à 15:57
Merci pour CommaText, DeltaFx.
Encore une que c'était dommage de pas la connaître...
Je vais donc de ce pas faire le ménage dans mes codes et jeter quelques fonctions laborieusement enfantées (dans la douleur, comme il se doit) à la poubelle.
krole57
Messages postés5Date d'inscriptionmercredi 14 juin 2006StatutMembreDernière intervention16 juin 2006 16 juin 2006 à 11:03
j'ai qd meme une autre question si on veut pas qu'il y est de doublon dans la Tstringlist (pas 2 fois le meme mot) comment peut on le gérer? est ce q commatext le fait automatiquement mais merci
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 16 juin 2006 à 23:20
Euhhhhhh pouf pouf pouf....
Réponse 1 : RTFM, c'est dans la doc, tu veux pas qu'on te la code aussi ton appli ? (Ouais moi c'est Brice, ca farte ?)
Réponse 2 : un stringlist à la propriété Duplicates qui te permet de régler le comportement de la bete face aux doublons.
Syntaxe Delphi :
propertyDuplicates:TDuplicates;
Description
Affectez une valeur àla propriété Duplicates pour spécifier comment la liste réagit à l'ajout d'une chaîne dupliquée dans une liste triée. La propriété CaseSensitive détermine si deux chaînes sont considérées comme dupliquées lorsqu'elles ne diffèrent que par la casse. (et tu casses, et tu casses....)
Duplicates doit avoir une des valeurs suivantes.
dupIgnore Ignore les tentatives d'ajout de chaînes en double àla liste.
dupError Déclenche une exception EStringListError lors d'une tentative d'ajout de chaînes dupliquées àla liste triée.
dupAccept Autorise les chaînes dupliquées dans la liste triée.
Définissez Duplicates avant d'ajouter des chaînes àla liste. L'initialisation de Duplicates à dupIgnore ou à dupError n'a aucun effet sur les chaînes en double se trouvant déjà dans la liste.
Remarque : Duplicates n'a aucun effet si la liste n'est pas triée.
Faut que je t'explique comment trier un stringlist ou tu peux t'en sortir tout seul ?