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

Langage Delphi Discussion :

Remplir directement un record avec un fichier ASCII


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Points : 89
    Points
    89
    Par défaut Remplir directement un record avec un fichier ASCII
    Bonjour,

    Il est possible lorsque l'on dispose d'un fichier en binaire de remplire une structure (recodre) d'un coup. On lit toute la structure d'un coup au lieu de lire valeur par valeur.
    exemple:
    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
    Type
      TAquaPro = record
        sync: byte;
        id: byte;
        size: word;
        Date: array[1..6] of byte;
    //[...]
        Humidite: word;
        CheckSumMOT: smallint;
    end;
     
    var
      mesureAquaPro:TAquaPro ; 
     
    begin
    [...]
    //Lecture directe:
    Buffer.Read(mesureAquaPro, sizeOf(mesureAquaPro));
    Existe il une commande pour faire la meme chose si le fichier est en ASCII? Ou une astuce...

  2. #2
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut Fichier ASCII
    Bonjour.

    Peux tu préciser exactement ce que tu veux faire ?

    Charger un fichier texte dans tableau de chaines de caracteres, dans un TStringList... Les longueurs des lignes de textes sont elles connues ou connait ont la longueur maximale des lignes ?
    Selon les caratéristiques du fichier texte, cela peut changer complètement la méthode et la vitesse d'exécution du code.

    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Points : 89
    Points
    89
    Par défaut
    Ben en fait je dispose d'une suite de valeures de type TdateTime et real dont l'ordre et le nombre sont connus (1 TdateTime et au max 100 real). Le separateur est l'espace. Pour l'instant j'ouvre mon fichier avec un TextFile et j'affecte les valeur une a une:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    For j :=0 to NbMesure do
    begin
      read(TextFile, Record.DateTime[j]);
      For i := 0 to 99 do
        read(TextFile, Record.valeur[j, i]);
      readln(TextFile);
    end;
    Je voudrais faire un truc plus simple du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    read(JeSaisPasQuoi, Record);
    C'est plus claire?

  4. #4
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut Record
    Ha ! Oui, c'est plus clair.

    Il s'agit donc de charger un fichier binaire dans une structure (Record) puis d'en extraire les données.

    Je t'envois un exemple concret dans la journée.

    A+

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Points : 89
    Points
    89
    Par défaut
    NONON!!!
    Justement en binaire je sait faire. C'est si le fichier est en ASCII que je ne sais pas faire...

    C'était pas assez claire en fait

  6. #6
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut TStringList
    Alors, quelque chose comme cela

    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
     
    Var
      ListesParametre  : TStringList;
      I                : Integer;
      Chn1, Chn2, Chn3 : String;
     
    begin
      // Créer un objet StringList temporaire
       ListesParametre := TStringList.Create;
       ListeParametres.LoadFromFile(NomFichierParametres);
       For I := 0 To ListeParametres.Count - 1 Do
        begin
           // Extraire les données
     
        end;
      // Détruire l'objet temporaire
      ListeParametres.Free;
    end;
    Ou bien :

    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
      ListesParametre  : TStringList;
      I                : Integer;
      Chn1, Chn2, Chn3 : String;
     
    begin
        // Créer un objet StringList temporaire
       ListesParametre := TStringList.Create;
       ListeParametres.LoadFromFile(NomFichierParametres);
       I := ListeParametres.Count;
       If I >= 3 Then
        begin
           Chn1 := ListeParametres[0];
           Chn2 := ListeParametres[1];
           Chn3 := ListeParametres[2]; 
        end;
      // Détruire l'objet temporaire
      ListeParametres.Free;
    end;

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Points : 89
    Points
    89
    Par défaut
    Sauf si ListesParametre est lisible via un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListesParametre.Read(mesureAquaPro, sizeOf(mesureAquaPro));
    je vais devoir extraire les données une a une (et du coup je ne voie pas l'interet de ces méthodes ).

    En fait la aussi je dois a un moment donné affecter toutes les variables de mon record une a une. Ma question est de savoir si il existe une methode permettant d'eviter cette tache assez laborieurse.

    En binaire, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Buffer.Read(mesureAquaPro, sizeOf(mesureAquaPro));
    permet déliminer l'affectation une a une des variables du record. Une fois que je suis passer par cette unique ligne, je peut travailler avec n'importe quelle valeur de mon recode: elle sont toutes affectées avec les valeurs contenue dans le flux.

    Je voudrais affecter toutes les valeurs d'un record a partir d'un fichier text ASCII en une seule ligne...

  8. #8
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Si ta structure est semblable à celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Type
      TAquaPro = record
        sync: byte;
        id: byte;
        size: word;
        Date: array[1..6] of byte;
    //[...]
        Humidite: word;
        CheckSumMOT: smallint;
    end;
    Tu ne peux pas faire autrement que de lire ligne par ligne la liste de chaines et de convertir les données.
    Si par contre c'est une structure de chaines de caractères, c'est différent.
    D'où ma question précédente :
    Charger un fichier texte dans tableau de chaines de caracteres, dans un TStringList... Les longueurs des lignes de textes sont elles connues ou connait ont la longueur maximale des lignes ?
    Selon les caratéristiques du fichier texte, cela peut changer complètement la méthode et la vitesse d'exécution du code.
    Petit rapel :
    Un fichier texte, est une suite d'octets dont la délimitation de chaque ensemble (Chaîne) est terminé par un octet #13.

    L'intéret d'utiliser un TStringList, est de simplier considérablement le code pour charger un fichier texte puisque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Liste.LoadFromFile(Nom);
    Plutôt que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    AssignFile(TextFile,Nom);
    Reset(TextFile);
     
    For j :=0 to NbMesure do
    begin
      read(TextFile, Record.DateTime[j]);
      For i := 0 to 99 do
        read(TextFile, Record.valeur[j, i]);
      readln(TextFile);
    end
    A+

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Points : 89
    Points
    89
    Par défaut
    Le truc c'est que une fois que le fichier est charger, je doit tout de meme affecter les valeur du record une à une: dans tous les cas l'étape fastidieuse (affectation de tous les champs du record) doit etre faite. Maintenant il est possible que la methode que tu propose soit plus rapide...

    Merci en tout cas!

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Une idée : utiliser effectivement une TStringList pour charger le fichier et coder l'enregistrement sur une ligne. Chaque ligne de l'objet contient donc un set de données propre.

    Après, utiliser un caractère spécial comme séparateur (par exemple "|"). Décoder la chaîne en utilisant la fonction de la RTL ExtractStrings. Pour chaque "bout de chaine" extrait, l'associer au champ correspondant du record...

Discussions similaires

  1. Remplir BDD avec un fichier SQl directement via frontoffice
    Par trossier dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 16/08/2012, 10h13
  2. remplir une base access avec un fichier .txt en VB.net
    Par altheorijinal dans le forum Windows Forms
    Réponses: 0
    Dernier message: 16/03/2009, 12h41
  3. Réponses: 3
    Dernier message: 19/01/2005, 15h50
  4. Réponses: 2
    Dernier message: 26/07/2004, 13h34
  5. Réponses: 3
    Dernier message: 27/01/2004, 18h46

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