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 :

tableau et fichier text


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut tableau et fichier text
    salut,comment je peux remplir un tableau à partir d'un fichier texte. le tableau doit contenir que des entiers.merci

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 894
    Points : 6 023
    Points
    6 023
    Par défaut
    Ca va dépendre de la structure du fichier texte...

    On peut voir quelques lignes de ce fichier ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut fichier
    le fichier va contenir des valeurs numeriques et des ';' comme séparateur

    exples 2004;2005;1003;6540;1200;1223;1475;10004;20004;

  4. #4
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 894
    Points : 6 023
    Points
    6 023
    Par défaut
    exples
    ça fait partie du fichier ? ou tu as voulu écrire "exemple" ?

    Sinon, je te suggère un TStringList:
    - LoadFromFile avec séparateur ";"
    - à partir du Count, tu dimensionnes ton tableau d'entiers
    - tu transtypes chaque item par StrToInt pour alimenter ton tableau

    Regarde l'aide Delphi pour les finesses d'utilisation des TStringList.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    merci pour votre reponse immediate, je suis pas familiariser avec la programation en delphi c'est pourquoi mes questions sont bêtes. j'ai essayé de faire ce que tu as sugérer mais ça marche pas. s'il vous plait essayer de me corriger les fautes. un grand merci
    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
     
    var
    List: TStrings;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    list := TStringList.Create;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var i,cnt: integer;
    begin
    try
    list.NameValueSeparator:=';' ;
    list.LoadFromFile('c:\fichier.txt');
    cnt:=templist.Count;
    //**********remplissage de tableau*****************
    for i :=1 to cnt do
    begin
    tabt[i]:= strtoint(templist.Strings[i]);
    end;
    [Modération]
    Merci d'utiliser les balises code ou quote, Laurent Dardenne
    [/Modération]

  6. #6
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par tarekcom
    merci pour votre reponse immediate, je suis pas familiariser avec la programation en delphi c'est pourquoi mes questions sont bêtes. j'ai essayé de faire ce que tu as sugérer mais ça marche pas. s'il vous plait essayer de me corriger les fautes. un grand merci
    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
    var
    List: TStrings;
    
    procedure TForm1.FormCreate(Sender: TObject);
       begin
              list := TStringList.Create;
         end;
    procedure TForm1.Button2Click(Sender: TObject);
    var i,cnt: integer;
      begin
                try
                list.NameValueSeparator:=';' ;
                list.LoadFromFile('c:\fichier.txt');
                cnt:=templist.Count;
    //**********remplissage de tableau*****************
                   for i :=1 to cnt do
                       begin
                       tabt[i]:= strtoint(templist.Strings[i]);
                  end;
    hum....
    ça ressemble à un beau double post ça : http://www.developpez.net/forums/sho...d.php?t=137511


    Je me cite moi même :

    Salut!

    La classe TStringlist est indexée à 0.
    Essaye ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := 0 to cnt - 1 do
      memo1.lines.add(templist.Strings[i]);
    Bon dev!

    -Slimjoe
    -Slimjoe

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    merci pour la reponse mais mon problème n'est pas encore résolu, j'ai donné un mauvais code. je veux affecter chaque valeur entre deux";" dans une case d'un tableau d'entiers.
    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
     
    procedure TForm1.Button2Click(Sender: TObject);
    var i,cnt: integer;
    begin
    try
    templist.NameValueSeparator:=';' ;
    templist.LoadFromFile('c:\fichier.txt');
    cnt:=templist.Count;
    for i :=0 to cnt-1 do
    begin
    tabt[i]:=strtoint(templist.Strings[i]);
    end;
    finally
    end;
    end;
    corrigez ce code s'il vous plait

  8. #8
    esa
    esa est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    A mon avis, tu as un problème de dimension de ton tableau.
    Sinon, qu'elle est l'erreur ?

    Mais pourquoi ne pas garder tes valeurs dans ta list et les utiliser directement là où tu en as besoin avec StrToInt(templist.strings[i]) ?
    [Dites][le][avec][des][tags].[Arf...]

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    le message d'erreur mentionne que "1000;1222;113;1111; n'est pas an integer
    le probleme est donc dans la conversion.
    " ces valeurs sont celles existantes dans le fichier txt. je veux les enregistrer dans un tableau pour pouvoir faire des calculs différents.(une moyenne,des frequences....)
    j'espere etre bien compris

  10. #10
    esa
    esa est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    C'est le séparateur qui n'est pas reconnu ou pris en compte car la string retournée contient la chaine de toutes tes valeurs... à priori tu n'as donc qu'un seul item dans ta TStringList.

    Je ne suis pas au boulot (donc pas de Delphi sous la main), mais la solution (provisoire) peut être de "parser" le templist.Strings[0] pour en tirer toutes les valeurs dans une autre TStringList par exemple.
    [Dites][le][avec][des][tags].[Arf...]

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tarekcom
    corrigez ce code s'il vous plait
    Merci de lire les régles du forum et les régles du club.


  12. #12
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par tarekcom
    le message d'erreur mentionne que "1000;1222;113;1111; n'est pas an integer
    le probleme est donc dans la conversion.
    " ces valeurs sont celles existantes dans le fichier txt. je veux les enregistrer dans un tableau pour pouvoir faire des calculs différents.(une moyenne,des frequences....)
    j'espere etre bien compris
    Je sais que ce n'est pas propre propre, mais pour rapidement mettre des valeurs séparées par un caractère dans un TStringList, j'utilise souvent StringReplace :

    maList.Text := StringReplace(maChaine, ';', #13, [rfReplaceAll ];

    Dans ton cas, ça ressemblerait à ça :

    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
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
       i, j: integer;
       parseList: TStringList;
       fichierList: TStringList;
    begin
      fichierList: TStringList.Create;
      parseList := TStringList.Create;
      fichierList.LoadFromFile('c:\fichier.txt');
     
      //Pour chaque ligne dans le fichier...
      for i := 0 to fichierList.Count - 1 do
      begin
        //...on remplace les ; par des retour de chariot et on met ça dans parseList...
        parseList.Text := StringReplace(fichierList.Strings[i], ';', #13, [rfReplaceAll];
     
        //...on boucle dans la parseList pour retrouver nos enregistrements qui sont maintenant sur des lignes de parseList...
        for j := 0 to parseList.Count - 1 do
        begin
          //...et on assigne à la valeur Integer celle du StringList à la bonne position
     
          //xxxxx := StrToInt(parseList.Strings[j]); <-- Mettre dans le tableau ici :)
        end;
      end;
     
      parseList.Free;
      fichierList.Free;
    end;

    Bon dev!

    -Slimjoe
    -Slimjoe

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut probleme
    merci beaucoup pour les reponses. aucun message d'erreur et afficher mais mon tableau reste toujours vide.(j'ai essayer de l'afficher mais il n'ya que les zéros dans le tableau)

  14. #14
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par tarekcom
    merci beaucoup pour les reponses. aucun message d'erreur et afficher mais mon tableau reste toujours vide.(j'ai essayer de l'afficher mais il n'ya que les zéros dans le tableau)
    J'aurais besoin de plus de détails sur ton tableau stp.
    Il est dynamique ? Statique ?

    Tu peux copier / coller ton code stp ? Et le fichier texte tant qu'à y être ?

    Merci!

    -Slimjoe
    -Slimjoe

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    le contenu de fichier est le suivant:
    2001;2005;4100;1144;1147;1547;15457;10;13;14
    j'ai essayer votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //declaration de tableau
    tabt : array [1..10] of integer;
    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
    //*********************************************//
    procedure TForm1.Button1Click(Sender: TObject);
    var
       i,j: integer;
       parseList: TStringList;
       fichierList: TStringList;
    begin
    
      fichierList:= TStringList.Create;
      parseList := TStringList.Create;
      fichierList.LoadFromFile('c:\fichier.txt');
    
      //Pour chaque ligne dans le fichier...
      for i := 0 to fichierList.Count - 1 do
      begin
        //...on remplace les ; par des retour de chariot et on met ça dans parseList...
        parseList.Text := StringReplace(fichierList.Strings[i], ';', #13, [rfReplaceAll]);
    
        //...on boucle dans la parseList pour retrouver nos enregistrements qui sont maintenant sur des lignes de parseList...
        for j := 1 to parseList.Count - 1 do
        begin
          //...et on assigne à la valeur Integer celle du StringList à la bonne position
          tabt[j] := StrToInt(parseList.Strings[j]); //<-- Mettre dans le tableau ici :)
           end;
          end;
      parseList.Free;
      fichierList.Free;
      end;
    

    mon tableau doit contenir les chiffres existants dans le fichier
    exemple
    tabt[1] contient le chiffre 2001;
    merci beaucoup
    [Balises CODE rajoutées par Pedro. Merci d'y penser à l'avenir]

  16. #16
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Code écrit "à la louche" (ça devrait marcher quand même) :


    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
    type TIntArray=array of integer;
    ...
    procedure Charge(NomFichier:string;var UnTableau:TIntArray);
    var SL1,SL2:TStringList;
         i,j,Taille:integer;
        s:string;
    begin
      SetLength(UnTableau,0);
      SL1:=TStringList.Create;
      SL2:=TStringList.Create;
      try
        SL2.Delimiter:=';';
        SL1.LoadFromFile(NomFichier);
        if SL1.Count>0 then
        for i:=0 to SL1.Count-1 do
        begin
          s:=SL1.Strings[i];
          SL2.DelimitedText:=s;
          Taille:=length(UnTableau);
          if SL2.Count>0 then
          begin        
            SetLength(UnTableau,Taille+SL2.Count);
            for j:=0 to  SL2.Count-1 do UnTableau[Taille+j]:=SL2.strings[j];
          end;      
        end;
      finally
        SL2.Free;
        SL1.Free; 
      end;
    end;
     
    ...
    var TonTableau:TIntArray;      
          i,Somme:integer;
    begin
      //Chargement du tableau
      Charger('TonFichier.txt',TonTableau);
      ...
      //utilisation
      Somme:=0;
      for i:=0 to high(TonTableau)-1 do
          somme:=somme+TonTableau[i];
    end;
    Bidouilleuse Delphi

  17. #17
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    remplace la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabt[j] := StrToInt(parseList.Strings[j]); //<-- Mettre dans le tableau ici :)
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabt[j] := StrToInt(parseList.Strings[j-1]); //<-- Mettre dans le tableau ici :)
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  18. #18
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    merci pour vos reponses, j'ai essayé le code de mr waskol mais ça pas marcher. le tableau reste toujours vide
    j'ai essayé de faire l'appel de la procedure charger dans un autre boutton.
    voila la façon que j'ai suivit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button1Click(Sender: TObject);
    var i,somme : integer;
    begin
    Charger('c:\fichier.txt',Tabt);
    Somme:=0;
    for i:=0 to high(Tabt)-1 do
    begin
    somme:= somme+ tabt[i] ;
    end;
    edit1.Text:=inttostr(somme);
    
    end;
    


    N.B tabt et fichier.txt sont mes paramêtres.
    [Balises CODE rajoutées par Pedro. Merci d'y penser à l'avenir]

  19. #19
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Salut,

    J'ai repris exactement ton code et y ajouté un bout qui affiche le contenu du tableau. Tout fonctionne parfaitement.


    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
     
    var
       i, j: integer;
       parseList: TStringList;
       fichierList: TStringList;
       tabt : array [1..10] of integer;
       sMessage: string;
    begin
       fichierList := TStringList.Create;
       parseList := TStringList.Create;
       fichierList.LoadFromFile('c:\fichier.txt');
       //Pour chaque ligne dans le fichier...
       for i := 0 to fichierList.Count - 1 do
       begin
          //...on remplace les ; par des retour de chariot et on met ça dans parseList...
          parseList.Text := StringReplace(fichierList.Strings[i], ';', #13, [rfReplaceAll]);
          //...on boucle dans la parseList pour retrouver nos enregistrements qui sont maintenant sur des lignes de parseList...
          for j := 0 to parseList.Count - 1 do  // <-- j'ai corrigé cette ligne. Attention :  c'est indexé à 0 et non 1 :)
          begin
             //...et on assigne à la valeur Integer celle du StringList à la bonne position
             tabt[j + 1] := StrToInt(parseList.Strings[j]);
          end;
       end;
       parseList.Free;
       fichierList.Free;
     
       //Afficher tableau
       sMessage := '';
       for i := 1 to 10 do
          sMessage := sMessage + IntToStr(tabt[i]) + #13;
       showmessage(sMessage);
    end;
    -Slimjoe
    -Slimjoe

  20. #20
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    il y a un gros problème dans le code que tu nous postes régulièrement : les TList sont indéxés à partir de 0, alors que ton tableau d'Integer est indexé à partir de 1 ; dans le code que tu viens de poster, tu fais un appel sur tabt[0] (premier passage de la boucle) et tu t'arrêtes à 9, donc il te tu n'utilise pas la dernière valeur du tableau
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

Discussions similaires

  1. Mettre en tableau un fichier texte
    Par xunil2003 dans le forum Langage
    Réponses: 1
    Dernier message: 29/07/2012, 21h23
  2. Tableau et fichier Texte
    Par kinder540 dans le forum C
    Réponses: 3
    Dernier message: 09/12/2011, 13h53
  3. Créer tableau dans fichier texte
    Par Hurricae dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 23/05/2011, 13h42
  4. Réponses: 5
    Dernier message: 15/05/2005, 09h51
  5. Réponses: 11
    Dernier message: 04/08/2003, 16h30

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