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

Bibliothèque standard C Discussion :

récupération de données à partir d'un fichier texte


Sujet :

Bibliothèque standard C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut récupération de données à partir d'un fichier texte
    Bonjour à tous

    Je suis actuellement en projet de telecom et dans celui ci je dois traiter des données.
    Ces données sont dans des fichiers .txt d'environ 160 000 lignes et il y a environ 3000 fichiers.

    exemple d'un bout de fichier à traiter:


    point (2.636000, 4.400000, 1.000000) <--------------------------------------------------------- il faut récupérer les 3 coordonnées du point
    167
    temps=80.385688 <--------------------------------------------------------- il faut récupérer ce nombre
    att=-94.330984 <--------------------------------------------------------- il faut récupérer ce nombre
    phase=0.879672
    angle_arrive_az=27.378480
    angle_arrive_el=0.000000

    Il faut récupérer toutes les données d'un fichier et ce dans 3000 fichiers.(Dans un fichier il y a environ 100 points, temps et att à récupérer.)


    Nous voulons donc récupérer toutes ces données dans un fichier txt sous la forme de 3 colonnes donnant: coordonnées du point le temps l'atténuation

    Auriez vous une solution simple à proposer pour automatiser tout ce rapatriement?
    En effet la programmation n'est pas notre domaine et nous manquons de connaisances pour réaliser ce genre de programme.
    Merci

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    la première question à laquelle il faudrait répondre c'est : est ce que votre fichier est structuré ? Autrement dit, est ce qu'il a toujours le même format => coordonnées, puis le temps, puis l'atténuation, ...

    Si c'est toujours le même schéma, il vous suffit d'utiliser les entrées/sorties habituelle du C : scanf étant la plus simple si vous êtes débutant.

    Si votre fichier n'est pas toujours de la même forme, il vous faut opérer en deux phases : d'abord lire le mot clé en début de ligne (par exemple "point"), puis en fonction de ce mot clef, lire ce qu'il doit y avoir après (si c'est un point il y a les coordonnées, si c'est l'atténuation il y a un "=" puis un chiffre, ...).

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Peut être aussi que si c'est du "one shot", la réalisation du programme avec perl ou awk sera plus rapide

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 39
    Points : 47
    Points
    47
    Par défaut
    D'accord avec ToTo13, visiblement tous tes fichiers ont la même structure.


    Une fois que tu as ouvert un fichier (fonction fopen, mode "rt"), tu le lis ligne par ligne avec par exemple ça :
    fscanf(fp, "%[^\n]", s);
    où s est un char* pointant sur une zone mémoire convenablement allouée, et fp le pointeur du fichier ouvert

    puis tu lis les valeurs avec par exemple ça :
    sscanf(p, "%g", d);
    où d est un double et p char* qui pointe au bon endroit dans la chaîne s.

    Et tu tournes en boucle jusqu'à la fin du fichier
    Et tu passes au fichier suivant.


    Mais pour changer de fichier facilement, les noms doivent avoir la même structure, sinon il faut utiliser des fonctions de recherche pour les ouvrir (même pas plus compliqué).

    Mais bon on espère que tu connais quand même les rudiments du C et des fonctions standard, donc je ne suis pas hyper précis.
    J'espère que ça t'aide déjà un peu.

  5. #5
    Inactif  

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    ludol59 :
    Ces données sont dans des fichiers .txt d'environ 160 000 lignes et il y a environ 3000 fichiers.

    exemple d'un bout de fichier à traiter:


    point (2.636000, 4.400000, 1.000000) <--------------------------------------------------------- il faut récupérer les 3 coordonnées du point
    167
    temps=80.385688 <--------------------------------------------------------- il faut récupérer ce nombre
    att=-94.330984 <--------------------------------------------------------- il faut récupérer ce nombre
    phase=0.879672
    angle_arrive_az=27.378480
    angle_arrive_el=0.000000

    Il faut récupérer toutes les données d'un fichier et ce dans 3000 fichiers.(Dans un fichier il y a environ 100 points, temps et att à récupérer.)
    Il faut d'abord clarifier la structure des données à traiter pour un fichier pour enfin la traiter de manière automatique pour le fichier récupérateur.

    Nous voulons donc récupérer toutes ces données dans un fichier txt sous la forme de 3 colonnes donnant: coordonnées du point le temps l'atténuation
    Pas sur que sur 3 colonnes cela tienne au niveau de la représentation.

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par komput Voir le message
    D'accord avec ToTo13, visiblement tous tes fichiers ont la même structure.


    Une fois que tu as ouvert un fichier (fonction fopen, mode "rt"), tu le lis ligne par ligne avec par exemple ça :
    fscanf(fp, "%[^\n]", s);
    où s est un char* pointant sur une zone mémoire convenablement allouée, et fp le pointeur du fichier ouvert
    Si la longeur max d'une ligne est connue, c'est OK. Je préfère en général indiquer à fscanf() le nombre maximum de caractères à saisir afin d'éviter les débordements de tampon ou utiliser la fonction fgets() qui est faite pour cela.

    Thierry

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par komput Voir le message
    Une fois que tu as ouvert un fichier (fonction fopen, mode "rt"),
    Pas de "rt" en C standard. C'est "r".

    http://emmanuel-delahaye.developpez....s.htm#fichiers

  8. #8
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Si les fichiers ont la même structure, tu peux essayer 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    { char buffer[256] ;
      float x, y, z, temps, att ;
     
      FILE *Hfile ;
     
      if((Hfile=fopen("file.txt", "r+"))==NULL)
      {
        fprintf(stderr, "Erreur d'ouverture du fichier file.txt\n") ;
        return EXIT_FAILURE ;
      }
     
      printf("X\tY\tZ\tTEMPS\tATT\n") ;
     
      while(!feof(Hfile))
      {
        if((fscanf(Hfile, "point (%f,%f,%f)\n", &x, &y, &z))==3)
        {
          printf("%2.3f\t%2.3f\t%2.3f", x, y, z) ;
        }
        else if((fscanf(Hfile, "temps=%f\n", &temps))==1)
        {
          printf("\t%2.3f", temps) ;
        }
        else if((fscanf(Hfile, "att=%f\n", &att))==1)
        {
          printf("\t%2.3f\n", att) ;
        }
        else fgets(buffer, 128, Hfile) ;  /* Lecture ligne autre */
      }
     
      fclose(Hfile) ;
     
      return EXIT_SUCCESS ;
    }

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pourquoi "r+" et non pas simplement "r" ?

  10. #10
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pourquoi "r+" et non pas simplement "r" ?
    Parceque....

    Car j'ai ouvert le fichier en lecture ET écriture. Effectivement un "r" suffit.

Discussions similaires

  1. Récupération de données à partir d'un fichier texte
    Par sarah8590 dans le forum Langage
    Réponses: 5
    Dernier message: 03/10/2014, 10h31
  2. Récupération de données à partir d'un fichier texte
    Par pyrrha dans le forum Téléchargez
    Réponses: 0
    Dernier message: 30/09/2011, 17h34
  3. [XL-2000] Récupération de données à partir d'un fichier texte
    Par laurence17 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/06/2010, 13h42
  4. ajout de données à partir d'un fichier texte
    Par drakenzara dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 14/04/2006, 12h39
  5. Réponses: 3
    Dernier message: 29/03/2006, 14h23

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