Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Invité de passage
    Inscrit en
    octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 6
    Points : 0
    Points
    0

    Par défaut Mettre un fichier CSV dans un tableau

    Bonjour à tous. Je suis ici en tant que nouveau et malgré ma recherche sur le forum des sujets je n'arrive pas résoudre mon problème.

    Je souhaite lire un fichier CSV et stocker les informations dans un tableau, comme si j'étais sur excel. (ex :Tab [Ligne][Colone])
    Je précise je ne suis que débutant en informatique.

    J'utilise un compilateur basique ( VIsual IO)

    Voici le format du CSV;
    Code texte :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ;Nb de combustible;35;;;;;;
    ;Nom;% C;% H;% N;%O;% C cendres;% Cendres;PCI
    1;AUTRE;0;0;0;0;0;0;0
    2;BOIS 2;9;4;6;3;8;9;6
    3;BOIS 3;10;7;6;4;9;14;7
    4;BOIS 4;11;10;6;5;10;19;8
    5;BOIS 5;12;13;6;6;11;24;9
    6;BOIS 6;13;16;6;7;12;26;10
    7;BOIS 7;14;19;6;8;13;28;11
    8;BOIS 8;15;22;6;9;14;30;12
    9;BOIS 9;16;25;6;10;15;32;13
    10;BOIS 10;17;28;6;11;16;34;14

    Comment dois je m'y prendre ? Surtout au niveau de la séparation des informations, J'arrive à lire la ligne entière mais je bute sur comment séparer les informations.

    Merci par avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2009
    Messages
    936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2009
    Messages : 936
    Points : 1 744
    Points
    1 744

    Par défaut

    Salut

    Une technique que j'utilise souvent pour separer les données quand elles se présentent sous cette forme :

    Pour chaque ligne, tu fais :
    Code :
    1
    2
    3
    4
    5
    var Data : TStringList;
    ...
     
    Data.Delimiter=';';
    Data.Text:=UneLigne;
    Si UneLigne contient 1;AUTRE;0;0;0;0;0;0;0, ton Data contiendra :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1
    AUTRE
    0
    0
    0
    0
    0
    0
    0
    Tu n'as plus qu'a convertir chaque item de Data vers ce que tu veux.

    Bonne chance !

  3. #3
    Invité de passage
    Inscrit en
    octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    je te remercies de cette réponse.
    Après plusieurs essais il semblerais que mon logiciel de programmation n'ai pas le Type TSringList défini. Je ne peux pas utilisé cet élément. Je suis bien embêter,

  4. #4
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2009
    Messages
    936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2009
    Messages : 936
    Points : 1 744
    Points
    1 744

    Par défaut

    Salut

    Alors tu es bon pour séparer les données a la main ... Utilise les fonction PosEx, et Copy pour obtenir un résultat similaire a ce que je t'ai donné.

    Quel compilateur utilise tu ?

  5. #5
    Invité de passage
    Inscrit en
    octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    Bonjour, je reviens vers vous.
    Donc reprendre depuis le début, voici le code que j'avais déveloper en utilisant une lecture sur un fichier excel
    Code :
    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
     
    IF NOT(Fileexists('.CSV')) then 
         begin
         Message('Base de données non disponible');
         //CLoseappli;
         end
         else
         begin
         BIT_COMBUSTILBE_AUTRE:=FALSE;
         StartExcel(FALSE);
         OPENFILEEXCEL('liste.CSV');
         NB_COMBUSTIBLE:=STRTOINT(READCELL(3,1));
         COMPTEUR:=0;
         REPEAT
               TAB_COMBUSTIBLE[COMPTEUR].Nom:=ReadCell(2,compteur+3);
               TAB_COMBUSTIBLE[COMPTEUR].C:=STRTOFLOAT(ReadCell(3,compteur+3));
               TAB_COMBUSTIBLE[COMPTEUR].H:=STRTOFLOAT(ReadCell(4,compteur+3));
               TAB_COMBUSTIBLE[COMPTEUR].N:=STRTOFLOAT(ReadCell(5,compteur+3));
               TAB_COMBUSTIBLE[COMPTEUR].O:=STRTOFLOAT(ReadCell(6,compteur+3));
               TAB_COMBUSTIBLE[COMPTEUR].CCENDRES:=STRTOFLOAT(ReadCell(7,compteur+3));
               TAB_COMBUSTIBLE[COMPTEUR].CENDRES:=STRTOFLOAT(ReadCell(8,compteur+3));
               TAB_COMBUSTIBLE[COMPTEUR].PCI:=STRTOFLOAT(ReadCell(9,compteur+3));
               compteur:=compteur+1; 
         Until compteur=NB_COMBUSTIBLE;
         QUITEXCEL;
         COMPTEUR:=0;  
         REPEAT 
                Addstring(TAB_COMBUSTIBLE[COMPTEUR].NOM);
                compteur:= compteur +1;
         Until compteur=NB_COMBUSTIBLE;    
         end

    Etant donnée que le programme tournera sur une machine qui n'a pas excel je shouaite utilsir un fichier CSV.
    'arrive à lire ligne par ligne dans une variable, mon problème réside dans la fragmation des données. Dernier essai jarrive a bien séparer les données seulement si il s'agit d'entier, les reels posent encore un problèmes.
    je vosus présente mon chantier
    Code :
    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
     
    var
     FIC :INTEGER;  
     DATA:String;
     Cpt,i,cel,lenth_ligne:integer;
     STR_TEMP: STRING;
     STR_DATA: array[0..250] of string;
    Begin
         If Start_visu then
         Begin
         if Fileexists('liste.CSV') then
         Begin
          Filetextopen(FIC,'liste.CSV');
          Readln(FIC,DATA);      
          lenth_ligne:=250;       
          i:=1;cel:=0;cpt:=1;
          Repeat 
                 if (DATA[i]<>';')then
                 begin
                      STR_TEMP[cpt]:=DATA[i];
                      cpt:=cpt+1;                   
                 end
                 else
                 begin
                      cpt:=1;
                      cel:=cel+1;
                 end;   
                 i:=i+1;           
                 STR_DATA[cel]:=STR_TEMP;
          until i=lenth_ligne;
          EDC:=STRTOINT(STR_DATA[3]);
          Filetextclose(FIC); 
         END;
         End;
    End;
    J'utilise comme compilateur un logiciel SCADA VISUAL I/O www.arsoft-int.com/vio.php

    Quels pistes explorer? Merci par avance

  6. #6
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2009
    Messages
    936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2009
    Messages : 936
    Points : 1 744
    Points
    1 744

    Par défaut

    J'avoue ne pas comprendre la finalité : Tu as un fichier Excel a la base, qui est traduit en fichier CSV. OK
    Ensuite, tu souhaite simplement afficher ce fichier dans une application ? Si c'est le cas, tu n'as qu'a utiliser un composant de type StringGrid, et tu n'auras même pas besoin de convertir tes données en entier ou float.

    Est tu obligé d'utiliser ce compilateur ?

    Je vois quelques corrections a apporter dans ton code :
    Code :
    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
    var
     FIC, i, cel : integer;
     STR_TEMP, DATA : string;
     STR_DATA : array[0..250] of string;
    Begin
      If Start_visu and Fileexists('liste.CSV') then
      Begin
        Filetextopen(FIC,'liste.CSV');
        Readln(FIC,DATA);      
        cel:=0;
     
        For i:=1 to Length(DATA) do  //a remplacer par 250 si nécessaire
        Begin
          If (DATA[i]<>';')then
            STR_TEMP:=STR_TEMP+DATA[i];
          Else
          Begin
            cel:=cel+1;
            STR_DATA[cel]:=STR_TEMP;
            STR_TEMP:='';
          End;            
        End;
     
        EDC:=StrToInt(STR_DATA[3]);
        Filetextclose(FIC); 
      End;
    End;

  7. #7
    Invité de passage
    Inscrit en
    octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    Je te remercies,
    C'est déja plus léger à écrire et un peu moins brouillon.

    Je reprend pour la finalité.
    j'ai un fichier .CSV de forme:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ;Nb de combustible;35;;;;;;
    ;Nom;% C;% H;% N;%O;% C cendres;% Cendres;PCI
    1;AUTRE;0.3;1.2;2.4;3;4;5;6
    2;BOIS 2;9;4;6;3;8;9;6
    3;BOIS 3;10;7;6;4;9;14;7
    4;BOIS 4;11;10;6;5;10;19;8
    5;BOIS 5;12;13;6;6;11;24;9
    6;BOIS 6;13;16;6;7;12;26;10
    7;BOIS 7;14;19;6;8;13;28;11
    8;BOIS 8;15;22;6;9;14;30;12
    9;BOIS 9;16;25;6;10;15;32;13
    10;BOIS 10;17;28;6;11;16;34;14
    je veux pouvoir initialiser un tableau de type combustible(voir la forme du type plus bas) à partir de ce fichier .CSV pour en exploiter les valeurs.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TYPE
    Combustible = RECORD
                NOM     :STRING;
                C       :REAL;
                H       :REAL;
                N       :REAL;
                O       :REAL;
                CCENDRES:REAL;
                CENDRES :REAL;
                PCI     :REAL;              
    END;
    pour exemple pour le premier combustible :=
    TAB_COMBUSTIBLE[0].NOM:= AUTRE
    TAB_COMBUSTIBLE[0].C:= 0.3
    TAB_COMBUSTIBLE[0].H:= 1.2
    TAB_COMBUSTIBLE[0].N:= 2.4
    TAB_COMBUSTIBLE[0].O:= 3
    TAB_COMBUSTIBLE[0].CCENDRES:= 4
    TAB_COMBUSTIBLE[0].CENDRES:= 5
    TAB_COMBUSTIBLE[0].PCI:= 6


    J ne peux pas utilise un autre compilateur car le reste du programme fonctionne et à déja été écrit.
    Je me heurte toujours à un problème, récupérer les valeur même si il s'agit de nombres réel.
    merci en éspérant être clair

  8. #8
    Invité de passage
    Inscrit en
    octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    J'ai trouvé pourquoi je narrivé pas a rècupérer les donné en float, la variable de destination été définit en Integer.

  9. #9
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2009
    Messages
    936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2009
    Messages : 936
    Points : 1 744
    Points
    1 744

    Par défaut

    Ok, super !

    Si ton problème est résolu, clique sur !

  10. #10
    Invité de passage
    Inscrit en
    octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    Meric, je ne trouve pas le nouton résolue

  11. #11
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    avril 2002
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Âge : 29

    Informations forums :
    Inscription : avril 2002
    Messages : 2 346
    Points : 3 862
    Points
    3 862

    Par défaut

    En bas de la page, il suffit de cliquer dessus. Je l'ai fait pour toi ce coup-ci
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •