Lister les mots d'une phrase

krole57 Messages postés 5 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 16 juin 2006 - 14 juin 2006 à 12:08
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Derniè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


end;

15 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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é.
0
krole57 Messages postés 5 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 16 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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
15 juin 2006 à 00:12
Oh la la.... Hey oh, DelimitedText / CommaText dans un stringList, ca vous dit rien les djeunz ?
0

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

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 juin 2006 à 12:13
Vaguement. Je suppose que ça reviendrait à faire mon code faux de 30 ligne en 2 ou 3 de justes !
0
krole57 Messages postés 5 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 16 juin 2006
15 juin 2006 à 12:14
non je ne connai pas
si tu pouvé m'expliquer et m'aider
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
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]
0
krole57 Messages postés 5 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 16 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;

en tout cas merci
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
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...
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
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.

Bonne prog'
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 juin 2006 à 16:05
Très sympa aussi le coup de l'ensemble. Je bourrine vraiment trops moi.
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
15 juin 2006 à 18:22
Bah de rien :)
On aurait pu le faire en récursif aussi, à coup de DelimitedText, en changeant le séparateur à chaque fois. ....
0
krole57 Messages postés 5 Date d'inscription mercredi 14 juin 2006 Statut Membre Dernière intervention 16 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
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
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 ?
0
Rejoignez-nous