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

Pascal Discussion :

Lecture d'un fichier texte en colonnes (espace ou tabulation)


Sujet :

Pascal

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 34
    Points : 28
    Points
    28
    Par défaut Lecture d'un fichier texte en colonnes (espace ou tabulation)
    Bonjour à tous.

    Je souhaite pouvoir lire une fichier texte tabulé de six colonnes. J'ai donc mon bout de code suivant :
    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 ChargerDepts;
    var CodeDept : Integer;
        REGION, DEP, CHEFLIEU, TNCC, NCC, NCCENR: string;
    begin
         assign(UserFile, 'depts2010.txt');
         reset(UserFile);
         CodeDept := 0;
         Repeat
               Readln(UserFile, REGION, DEP, CHEFLIEU, TNCC, NCC, NCCENR);
               Departements[CodeDept] := DEP + '-' + NCC;
               //Form1.ComboBox1.Items.Add(DEP + '-' + NCC);
         Until Eof(UserFile);
         Close(UserFile);
    end;
    Or, lorsque je déroule mon ComboBox1, j'ai une liste de N tirets au lieu de "01-AIN" pour le premier élément.

    Ma question est donc : la syntaxe est-elle la bonne? Et est-ce que c'est faisable?

    Merci d'avance.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 941
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 941
    Points : 5 652
    Points
    5 652
    Par défaut
    Joa,

    Non, tu ne peux pas lire plusieurs variables de type String avec un Read (ou ReadLn).

    Comme la 1ère variable de la liste à lire est de type String, toute la ligne va y être entrée.

    À toi de lire la ligne, et de la découper en tes différentes variables.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Bon tant pis.

    Merci pour la réponse.
    Je demandais car sur ce site http://www.wonko.info/ipt/sse/pascal/pascal12.htm, il le laisse croire.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 941
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 941
    Points : 5 652
    Points
    5 652
    Par défaut
    Mai,

    Tu peux facilement contrôler ce que j'ai dit en vérifiant le contenu de ta première variable lue, REGION.

    Qui ne contiendra pas forcément TOUTE la ligne si cette variable ne dispose pas de suffisamment de place, mais elle contiendra du début de la ligne à sa longueur max.

    On peut lire plusieurs variables sur une seule ligne avec ReadLn, mais il faut que la ligne puisse être découpée logiquement.
    On peut par exemple avoir une ligne comme
    121 36.6e12 -1 ET la suite...
    et la lire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      n : Integer;
      r : Real;
      i : Integer;
      s : String
     
    ...
    ReadLn(le_fichier,n,r,i,s)
    Tu remarques qu'on peut lire une chaîne, mais seule la dernière partie d'une ligne peut y être lue, car en natif, TOUS les caractères étant valides dans une String de Pascal, on ne dispose d'aucun moyen pour séparer une chaîne en d'autres chaînes.
    Il faut en passer par une fonction qui va faire le découpage.
    C'est simple à faire, et c'est un exercice qu'on donne souvent à faire.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par zoom* Voir le message
    [CODE]
    Readln(UserFile, REGION, DEP, CHEFLIEU, TNCC, NCC, NCCENR);
    Pour comprendre ce que dit droggo, tu peux considerer le fichier suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     1452 15 centaurus ttnc ncc nccer
    Supposer que les variables REGION, ... contiendront les valeurs adéquates revient à dire que readln devinera que tu veux qu'il découpe la chaine en 6 morceaux en utilisant la tabulation comme separateur. La question serait de savoir pourquoi ne copierait il pas toute la ligne dans une variable, ou utilise un autre separateur pour decouper la chaine?

    La solution serait de lire toute la chaine dans une variable, puis d'utiliser une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    split(chaine : string; separ : char; ind : integer) : string;
    pour recuprer la partie de la chaine que tu veux.

    Citation Envoyé par droggo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      n : Integer;
      r : Real;
      i : Integer;
      s : String
     
    ...
    ReadLn(le_fichier,n,r,i,s)
    Je me demandais s'il est permis de lire des integer et des real avec readln dans un fichier text.

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 941
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 941
    Points : 5 652
    Points
    5 652
    Par défaut
    Hia,

    Bien sûr, exactement comme au clavier, qui n'est jamais qu'un "fichier" avec un statut spécial.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par droggo Voir le message
    Hia,

    Bien sûr, exactement comme au clavier, qui n'est jamais qu'un "fichier" avec un statut spécial.
    Mon inquietude etait surtout au fait que les compilateurs utilise un format special pour serialisé les données. Si on ecrit par exemple 1.25 dans un fichier text, et si le compilateur utilise par exemple 32 byte pour les real, je suppose que faire readln(f, reel) provoquera une erreur.

    Mais bon, je vais tester tout ça quand j'aurais freepascal sous la main.

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 941
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 941
    Points : 5 652
    Points
    5 652
    Par défaut
    Joa,

    Le cas qui nous intéresse ici n'est pas la lecture dans un fichier binaire, mais dans un fichier texte.
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/05/2015, 10h37
  2. Réponses: 6
    Dernier message: 09/08/2013, 16h32
  3. lecture fichier texte à plusieurs colonnes
    Par Dakota Block dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/07/2013, 13h38
  4. lecture des fichiers texte à partir d'espace FTP
    Par fishingman dans le forum ASP.NET
    Réponses: 5
    Dernier message: 07/06/2010, 02h12
  5. Lecture de fichier text avec colonne vide
    Par Ballim dans le forum MATLAB
    Réponses: 5
    Dernier message: 12/11/2008, 17h12

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