IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Suppression de ligne tableau suite a récupération de donnée dans un fichier TXT


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 77
    Points : 32
    Points
    32
    Par défaut Suppression de ligne tableau suite a récupération de donnée dans un fichier TXT
    Bonjour,

    J'ai un petit soucis avec mon code. Je suis bloquer depuis 2jours.. pourtant je ne pense pas que la solution soit très difficile ^^. Je m'explique.

    J'ouvre un fichier texte. J'analyse chaque ligne pour y trouver les différents mots. Chaque mots ( plus grand que 5 caractères) trouver seront placé ensuite dans un tableau.

    J'arrive a trouver les mots et les placés dans le tableau. Le tableau reprend malheureusement TOUT les mots mais n'affiche que ceux qui ont minimum 5 lettres. J'ai donc dans mon tableau pour la phrase "Bonjour tout le monde" : [ 'bonjour', '', '', 'monde'] qui sera afficher, au lieu de [ 'bonjour','monde'].
    Il me compte 4 mots alors qu'il y en a 2 qui ont 5 lettres

    Je ne sais pas si je suis assez claire dans ce que je dis :p

    Enfin voila.... Je vais vous montrer mon code, je l'ai commenté au mieux

    (Il faut crée un fichier texte dans le mm dossier que le projet pour qu'il fonctionne bien évidement )

    Merci beaucoup pour votre aide et/ou avis/commentaire utiles

    Arsenik


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    program trouver_mot_dans_texte_min_5_lettres;
     
    {$APPTYPE CONSOLE}
    // sortir les differents mot dans un fichier texte,
    //les mettres dans un tableau pour ensuite les afficher
    uses
      SysUtils;
    var
      Tmot           : array[0..4000] of string;
      lettre         : set of char =['a'..'z','A'..'Z','é','è','à','ï','ë','â','ô','î','ê'];
      CptMot         : Integer;
     
    // trouver les mots possibles dans chaque lignes du fichier 'f'
    procedure AnalyseLigne(S : string);      // 'S' remplace 'Ligne' => la fonction peut etre utilisé ailleur du coup.
    var
      i : Integer;
      motTemp : string;
    begin
      for i := 1 to length(s) do      // parcour du string pr trouver les mots, cad la ligne
        begin
          if charinset(s[i],lettre) then      // si != lettre ca vx dire qu'on a un mot !
             motTemp:= motTemp + s[i]
          else
           if (MotTemp <> '' ) then        // Pour éviter des mot en tant qu'espace. Pas d'element de tableau vide :)
             begin
                CptMot:= CptMot +1;      // Compteur de mot. Permet de le placer ds le tableau !
                motTemp := '';           // vider motTemp
             end;
           if (length(MotTemp) > 4) then
               Tmot[CptMot]:= motTemp;  // ajouter au tableau
        end;
    end;
     
    // affichage le tableau
    procedure affichageMot;
    var
    i:integer;
      begin
        for i := 0 to CptMot do
        begin
          writeln(Tmot[i]);
          if I mod 20 = 0 then readln;           // Permet de couper l'affichage des mot par groupe de 20 !
        end;
      end;
     
    var
      Ligne : string;
      f : text;
     
    // Debut du programme
    begin
    CptMot:= 0;
    assignfile (f, 'mot.txt');
    reset(f);                         // ouvrir en lecture
                                      {*rewrite := commence par ouvrir en effacant tt
                                      pour ecrire dedans par la suite en réecrivant  *}
                                      {* append := ouvrir en ecrite pour y ecrire a la FIN
                                      apres *}
    while not eof(f) do
      begin
        readln(f,Ligne);
        AnalyseLigne(Ligne);       // a chaque ligne, verifier les mot qui y sont
      end;
    CloseFile(f);
      writeln('Il y a : ', cptMot, ' mot(s)');
      writeln('Les mots sont : ');
      affichageMot;             // affichage des mots trouves
     
    readln;
    end.

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Au vu de l'indentation il ne manquerait pas un Begin end dans ton code ?
    De plus tu incrémentes ton tableau à chaque fois que tu as un mot (qu'il fasse 5 ou pas) donc normal que tu es des lignes en plus)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    procedure AnalyseLigne(S : string);      // 'S' remplace 'Ligne' => la fonction peut etre utilisé ailleur du coup.
    var
      i : Integer;
      motTemp : string;
    begin
      for i := 1 to length(s) do      // parcour du string pr trouver les mots, cad la ligne
      begin
        if charinset(s[i],lettre) then      // si != lettre ca vx dire qu'on a un mot !
          motTemp:= motTemp + s[i]
        else begin
          if (length(Trim(MotTemp)) > 4) then
          begin
           CptMot:= CptMot +1;      // Compteur de mot. Permet de le placer
           Tmot[CptMot]:= motTemp;  // ajouter au tableau
           motTemp := '';           // vider motTemp
          end; // if
        end; // else if
      end; // for
    end;

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 77
    Points : 32
    Points
    32
    Par défaut
    Tout d'abord, merci pour cette réponse rapide !

    Oui, je sais bien.
    A la base, j'avais mis un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (motTemp<>'') then
    dec(CptMot);
    mais bon, ça ne fonctionnait pas des masses ^^

    tu utilise ici "trim"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if (length(Trim(MotTemp)) > 4) then
    Je ne connaissais pas. Tu sais m'en dire un peu plus dessu ?

    Ceci dit, maintenant le problème des éléments de tableau vide est ok, mais le séparateur de mot ne fonctionne plus correctement
    Ici, il regroupe tout pour qu'ensemble, ça fasse minimum 5 lettre

    Par exemple, j'ai dans mon tableau 'lemonde' au lieu de 'monde' car 'le' est un mot mais qui ne fais pas 5 lettres..
    Tu vois ce que je vx dire ?

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le Trim() retourne une chaine épurée des espaces et caractères spéciaux (< #31, plus d'info avec F1).

    Sinon pense à cliquer sur en bas de page

    [Edit]

    il faut sortir le MotTemp := '';
    du if pour réinitialiser juste après vérification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    procedure AnalyseLigne(S : string);      // 'S' remplace 'Ligne' => la fonction peut etre utilisé ailleur du coup.
    var
      i : Integer;
      motTemp : string;
    begin
      for i := 1 to length(s) do      // parcour du string pr trouver les mots, cad la ligne
      begin
        if charinset(s[i],lettre) then      // si != lettre ca vx dire qu'on a un mot !
          motTemp:= motTemp + s[i]
        else begin
          if (length(Trim(MotTemp)) > 4) then
          begin
           CptMot:= CptMot +1;      // Compteur de mot. Permet de le placer
           Tmot[CptMot]:= motTemp;  // ajouter au tableau
          end; // if
          motTemp := '';           // vider motTemp
        end; // else if
      end; // for
    end;

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 77
    Points : 32
    Points
    32
    Par défaut
    Génial !

    Donc avec la fonction "trim", plus besoin de spécifier les carractere spéciaux ds ma varibale lettre alors ?

    Merci bcp

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par arsenik360 Voir le message
    Génial !

    Donc avec la fonction "trim", plus besoin de spécifier les carractere spéciaux ds ma varibale lettre alors ?

    Merci bcp
    Non rien à voir, àéù etc ... sont des caractères normaux et non des caractères spéciaux.
    #13 CR, #10 LF, #9 Tab vertical, etc ..., eux, sont des caractères spéciaux (dans la table ascii c'est les caractères de 1 à 31)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération de données dans un fichier .txt
    Par Crackos dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/09/2010, 14h15
  2. Réponses: 6
    Dernier message: 20/01/2008, 16h32
  3. problème récupération de données dans des fichiers .DAT
    Par indymontpellier dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/04/2006, 07h54
  4. Réponses: 16
    Dernier message: 10/11/2005, 21h10
  5. Réponses: 6
    Dernier message: 23/10/2005, 12h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo