Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2413 connectés 

  FORUM HardWare.fr
  Programmation
  C

  récupération de données grâce à un programme C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

récupération de données grâce à un programme C

n°1674944
romainr
Posté le 22-01-2008 à 12:00:07  profilanswer
 

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  
 romain

mood
Publicité
Posté le 22-01-2008 à 12:00:07  profilanswer
 

n°1674947
Elmoricq
Modérateur
Posté le 22-01-2008 à 12:02:47  profilanswer
 

Si tu as le choix, préfère un langage comme PERL plutôt que le C pour ce genre de tâche, ça te prendra beaucoup moins de temps à coder surtout si tu n'es pas à l'aise avec ce langage.
 
En PERL ça s'écrit en une vingtaine de lignes de code, et l'exécution de ce genre de tâche se fait très rapidement.
 
Si tu n'as pas le choix de la technologie, alors il te faudra passer par les fonctions fgets() pour la lecture, et pour la recherche dans la chaîne + extraction des champs : strchr, strtok et consors.


Message édité par Elmoricq le 22-01-2008 à 12:03:18
n°1674957
romainr
Posté le 22-01-2008 à 12:21:01  profilanswer
 

merci beaucoup, mais je ne connais rien non plus au PERL, peux tu me donner des pistes pour ce programme?

n°1675030
Elmoricq
Modérateur
Posté le 22-01-2008 à 14:04:24  profilanswer
 

Ce n'est pas très difficile en PERL.
 
Comme ça très très rapidement, non vérifié, à la va-vite en pas propre, et en assumant que la structure est toujours telle que tu nous l'as donnée, t'as un truc dans le genre :

Code :
  1. #! /usr/bin/perl
  2.  
  3. use strict;
  4.  
  5. opendir DIR, "repertoire_contenant_les_fichiers" or die "Ouverture du repertoire impossible : $!\n";
  6.  
  7. foreach my $file ( readdir DIR )
  8. {
  9.   my ($point, $temps, $att) = ();
  10.   open FICHIER, "<$file" or die "Impossible d'ouvrir '$file' : $!\n";
  11.  
  12.   foreach my $line ( <FICHIER> )
  13.   {
  14.      chomp $line;
  15.      if ( $line =~ m/^point/ )
  16.      {
  17.         ($point = $line) =~ s/point\((.*?)\)/$1/;
  18.      }
  19.      elsif ( $line =~ m/^temps=/ )
  20.      {
  21.         ($temps = $line) =~ s/temps=//;
  22.      }
  23.      elsif ( $line =~ m/^att=/ )
  24.      {
  25.         ($att = $line) =~ s/att=//;
  26.  
  27.         print "$point - $temps - $att\n";
  28.         ($point, $temps, $att) = ();
  29.      }
  30.   }
  31.  
  32.   close FICHIER;
  33. }
  34.  


 
Y a surement des erreurs qui trainent je n'ai pas trop le temps de vérifier, zieute la documentation du langage ici en cas de souci (ou pose des questions si tu ne comprends pas) : http://perldoc.perl.org


Message édité par Elmoricq le 22-01-2008 à 14:05:06
n°1675134
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-01-2008 à 15:43:13  profilanswer
 

romainr a écrit :

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.


Pour ce qui est du C, on a pas rien à proposer. C'est à toi de spécifier correctement ton besoin, de concevoir la solution, d'écrire ton code et de le soumettre pour commentaires, corrections et/ou améliorations. Si tu ne connais pas le C, on ne peut pas grand chose pour toi... Si tu ne connais ni l'algorithmie ni la programmation, encore moins...
 
Il y a des livres, des sites, des tutoriels, et même des professionnels pour se former...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1675914
bobleblob
Posté le 23-01-2008 à 20:01:11  profilanswer
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_LINE        300
  5. int main(int argc, char * argv[])
  6. {
  7.   FILE * fic ;
  8.   char buf[MAX_LINE +1] ;
  9.   char * pd, * pf ;
  10.  
  11.   if (argc != 2)
  12.   {
  13.     fprintf(stderr, "syntaxe : %s <fichier>\n", argv[0]) ;
  14.     exit(EXIT_FAILURE) ;
  15.   }
  16.  
  17.   fic = fopen(argv[1], "r" ) ;
  18.   if (fic == NULL)
  19.   {
  20.     perror("fopen" ) ;
  21.     exit(EXIT_FAILURE) ;
  22.   }
  23.  
  24.   fgets(buf, MAX_LINE, fic) ;
  25.   while (!feof(fic))
  26.   {
  27.     if (strstr(buf, "point" ) == buf)
  28.     {
  29.       pd = buf ;
  30.       while (*pd != '\0' && *pd != '(') pd ++ ;
  31.       if (*pd != '\0')
  32.       {
  33.          pd ++ ;
  34.          pf = pd ;
  35.          while (*pf != '\0' && *pf != ')') pf ++ ;
  36.          if (*pf != '\0')
  37.          {
  38.             *pf = '\0' ;
  39.             printf("%s;", pd) ;
  40.          }
  41.       }
  42.     }
  43.     else if (strstr(buf, "temps" ) == buf)
  44.     {
  45.         pd = buf ;
  46.         while (*pd != '\0' && *pd != '=') pd ++ ;
  47.         if (*pd != '\0')
  48.         {
  49.           pd ++ ;
  50.           pf = pd ;
  51.           while (*pf != '\0' && (isdigit(*pf) || *pf == '.' || *pf == '-')) pf ++ ;
  52.           *pf = '\0' ;
  53.           printf("%s;", pd) ;
  54.         }
  55.     }
  56.     else if (strstr(buf, "att" ) == buf)
  57.     {
  58.         pd = buf ;
  59.         while (*pd != '\0' && *pd != '=') pd ++ ;
  60.         if (*pd != '\0')
  61.         {
  62.           pd ++ ;
  63.           pf = pd ;
  64.           while (*pf != '\0' && (isdigit(*pf) || *pf == '.' || *pf == '-')) pf ++ ;
  65.           *pf = '\0' ;
  66.           printf("%s\n", pd) ;
  67.         }
  68.     }
  69.    
  70.     fgets(buf, MAX_LINE, fic) ;
  71.   }
  72.  
  73.   fclose(fic) ;
  74. }


 
A appeler en boucle dans un script pour passer les 3000 fichiers à la moulinette et en dirigeant la sortie standard vers le fichier CSV à produire.
Sous réserve que les fichiers soient constitués de blocs identiques à celui montré...
 
Il est bien évident que le C n'est pas le plus indiqué pour ce genre de choses...

n°1675924
Elmoricq
Modérateur
Posté le 23-01-2008 à 20:26:04  profilanswer
 

Code :
  1. exit(EXIT_FAILURE) ;
 

Pour pas return ? [:petrus dei]
À ce propos, il en manque un à la fin de main().
 

Code :
  1. while (!feof(fic))
 

Surement pas.
En effet, que se passe-t-il si fgets() échoue à cause d'une erreur de lecture, et pas parce qu'une fin de fichier a été rencontrée ?
Ou bien si la dernière ligne se termine par EOF au lieu de '\n' ?

 

Ce qu'il faut tester ici, c'est le code retour de fgets(). Ensuite seulement, si tu le souhaites, tu peux gérer la raison pour laquelle fgets() a retourné NULL, en testant avec feof() ou ferror().

Message cité 1 fois
Message édité par Elmoricq le 23-01-2008 à 20:26:14
n°1676044
bobleblob
Posté le 24-01-2008 à 10:01:59  profilanswer
 

Elmoricq a écrit :

Code :
  1. exit(EXIT_FAILURE) ;


 
Pour pas return ? [:petrus dei]
À ce propos, il en manque un à la fin de main().
   

Code :
  1. while (!feof(fic))


 
Surement pas.
En effet, que se passe-t-il si fgets() échoue à cause d'une erreur de lecture, et pas parce qu'une fin de fichier a été rencontrée ?  
Ou bien si la dernière ligne se termine par EOF au lieu de '\n' ?
 
Ce qu'il faut tester ici, c'est le code retour de fgets(). Ensuite seulement, si tu le souhaites, tu peux gérer la raison pour laquelle fgets() a retourné NULL, en testant avec feof() ou ferror().


 
:D
 
Merci pour ces conseils :)
Comme tu l'as compris, c'est fait "Comme ça très très rapidement, non vérifié, à la va-vite en pas propre, et en assumant que la structure est toujours telle [qu'il] nous l'as donnée".
L'absence de return est anecdotique (le retour par defaut est 0). La remarque sur fgets est tout à fait juste. D'ailleurs tiens, tant qu'on y est, l'utilisation de perror() est pas terrible non plus, il vaut mieux mettre perror(argv[1]) c'est beaucoup plus parlant.
 
Ca marche dans le cas nominal, après si il veut en faire un beau programme C tout propre, il a déjà une base :)
 
 

n°1677440
romainr
Posté le 27-01-2008 à 15:14:57  profilanswer
 

Merci pour vos réponses!
On a réussi à faire notre petit programme.
Si ça vous intéresse je peux le poster!
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  récupération de données grâce à un programme C

 

Sujets relatifs
Question rapide programme en C !Modifier programme pour automatiser une tache
[Résolu] PB pour enregistrer des données dans la BSD ACCESS avec VBALire et écrire dans une base de données SQL via Excel
programme concernant les tableaux[Access] Modification d'une base de données
Choix de base de données pour structurer du contenu[C] Recupération de la position du curseur.
Programme impossible ?Petit programme simple pour débutant VBA
Plus de sujets relatifs à : récupération de données grâce à un programme C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR