Petit soucis sur une boucle [Résolu]

Signaler
Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
-
Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
-
 Salut les copains,

  Quelqu'un peut il m'aider à trouver ou je me suis tromper je tourne en rond depuis hier
et je ne trouve rien de rien,
voilà j'ai le code suivant , qui doit doit traiter un texte qui comporte 1600 lignes
il doit normalement à la fin me retourner un texte d'environ 160 lignes
mais au lieu de cela il retourne que la première ligne j'ai beau prendre les choses les étudier mais je ne vois pas où j'ai pu me planter
 si quelqu'un veut bien m'aider  je l'en remercie d'avance. Je continue à chercher
je sais que 2 paires d'yeux valent souvent mieux qu'une

VOICI LE CODE
****************************************************************************************
****************************************************************************************
program vie;

{$APPTYPE CONSOLE}

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Dialogs,
  strutils,
  StdCtrls;
  Var

  TS: TStringList;

  chaine:  array [1..24]of string;
 RS,adresse1,adresse2,CP,telephone,p,nb,ligne4, localite,ligne: string;
 dec : textfile;
  j,i:integer;
  civilite: array[1..3] of string =('MR','MM','. ');

  procedure inc_tableau ;  {procedure qui va mettre
   les valeurs récupéré dans le tableau}
   begin
   chaine[1]:=RS;
   chaine[2]:=adresse1;
   chaine[3]:=adresse2;
   chaine[4]:=cp;
   chaine[5]:=localite;
   chaine[6]:=telephone;
   chaine[7] := nb;
   chaine[8]:=p;
   end;

   procedure Make_csv;
   {on va fabriqer un csv à partir d'un TStringlist}
    var
    N_TS: TStringList;
   k, l:integer;

   begin
   N_TS:= Tstringlist.Create;
   N_TS.Delimiter:=';';
   for l := 1 to 8  do
     N_TS.Insert(l-1,chaine[l]);
   ligne4:=ansiReplacestr(N_TS.DelimitedText,'"','');

           writeln(dec,ligne4);

           For k:=7 downto 0
   Do begin
   N_TS.Delete(k)
   end;
    N_TS.Free;

   end;
  procedure recupvaleur;
  {récupération de valeurs dans variables Globale}
  begin

   RS:=copy (ts[i],1,27);
   telephone:= copy (ts[i],28,13);
   if telephone[3]='.' then
   begin
     telephone:= telephone + copy (ts[i+1],42,1);
     nb:=copy (ts[i+1],43,2);
     p:= copy (ts[i+1],49,6) ;
     adresse1:= copy (ts[i+2],1,35);
     adresse2:= copy (ts[i+3],1,35);
     cp:= copy (ts[i+5],1,5);
     localite:= copy (ts[i+5],7 ,35);
   end
   else
   begin
   nb:=copy(ts[i],14,2);
   p:=copy(ligne,48,5);
   adresse1:=copy(ts[i+2],1,35);
   adresse2:=copy(ts[i+3],1,35);
   cp:= copy(ts[i+4],1,5);
   localite:= copy(ts[i+4],6,35);
   end;

  end;

begin

  { TODO -oUser -cConsole Main : Insert code here }
  TS:= TStringlist.Create;
  TS.LoadFromFile('C:\biker\vie\came.txt');

  assignfile(dec,'c:\biker\vie\dec.txt') ;
           rewrite(dec);

  for i:=  0 to TS.Count - 1 do
    begin
    for j := 1 to 3 do

      if civilite[j]=copy(ts[i],1,2) then
      begin
      recupvaleur;
      inc_tableau;
      Make_csv;
       close(dec);
      end
       else

    end;
******************************************************************************************
******************************************************************************************

Merci d'avance

couf

3 réponses


Salut Couf,

A priori tu essaye de faire un parseur est d'enregistrer le résultat dans un fichier texte. Quand je lis ton code je me dis qu'il y a un énorme problème de conception.

Ensuite il y a des problèmes de logique :

*Pourquoi déclarer ton tableau comme cela : chaine:  array [1..24]of string;
Il serait plus avantageux de le faire ainsi 
chaine:  array [0..23]of string ce qui induirait 
//
for 0 := 0 to 7  do
N_TS.Insert(i,chaine[i]);
Ca change rien sauf que ca optimise sacrément ton code (8 soustractions en moins à chaque boucle).

Ensuite :
For k:=7 downto 0 Do
begin    
N_TS.Delete(k)
end;

C'est quoi ce Begin/End inutile ??

De plus 
For k:=7 downto 0 Do
begin    
N_TS.Delete(k)
end;
N_TS.Free;

Quel est l'intéret de supprimer les lignes si tu libères ton StringList immédiatement après ?

   if telephone[3]='.' then
   begin
     telephone:= telephone + copy (ts[i+1],42,1);
     nb:=copy (ts[i+1],43,2);
     p:= copy (ts[i+1],49,6) ;
     adresse1:= copy (ts[i+2],1,35); /////Identique en dessous
     adresse2:= copy (ts[i+3],1,35); /////Identique en dessous
     cp:= copy (ts[i+5],1,5);
     localite:= copy (ts[i+5],7 ,35);
   end
   else
   begin
   nb:=copy(ts[i],14,2);
   p:=copy(ligne,48,5);
   adresse1:=copy(ts[i+2],1,35);  /////Identique au dessus
  adresse2:=copy(ts[i+3],1,35);  /////Identique au dessus
   cp:= copy(ts[i+4],1,5);
   localite:= copy(ts[i+4],6,35);
   end;

Ton If ....  Then .... Else est à donc améliorer 

Ensuite : 

  TS:= TStringlist.Create;
  TS.LoadFromFile('C:\biker\vie\came.txt');
  /////Attention aux StringList quand on charge un fichier dedans : Voir la limitation de tailles.

  assignfile(dec,'c:\biker\vie\dec.txt') ;
  rewrite(dec);

//Qu'est ce que c'est que ces blocks de mémée ? On travaille avec les Streams Couff

  for i:=  0 to TS.Count - 1 do
    begin
    for j := 1 to 3 do
      if civilite[j]=copy(ts[i],1,2) then
      begin
      recupvaleur;
      inc_tableau;
      Make_csv;
       close(dec); ///Tu fermes ton fichier des la premiere boucle => Conclusion c'est foutu
      end
       else  //Sinon quoi ????????

    end;
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
38
Salut,

j'ai pas testé ton code mais le fait d'utiliser la valeur de "I" en dehors de sa boucle ne me parait pas correcte !!!

change ton code et passe la valeur de "I" à la procedure RecupValeur

procedure RecupValeur(const Idx: Integer);
begin
  ... // changer tous les I en Idx ;)
end;

//et l'appel:
RecupValeur(I);

 
@+
Cirec

<hr siz="" />
Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
1
Merci Les gars,

    Franchement Merci, tu as raison je dois utiliser des streams mais je suis guère à l'aise avec.
En Tout cas 2 choses
1) Vos remarques  m'ont aidées.
2)  Je remarque qu'effectivement si on respecte le règlement cela fonctionne bien
     Surtout à tous les autres si vous voulez qu'on vous aides laissez un petit bout de code

couf