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

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

Marsh Posté le 22-01-2008 à 12:00:07    

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

Reply

Marsh Posté le 22-01-2008 à 12:00:07   

Reply

Marsh Posté le 22-01-2008 à 12:02:47    

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
Reply

Marsh Posté le 22-01-2008 à 12:21:01    

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

Reply

Marsh Posté le 22-01-2008 à 14:04:24    

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
Reply

Marsh Posté le 22-01-2008 à 15:43:13    

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/
Reply

Marsh Posté le 23-01-2008 à 20:01:11    

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...

Reply

Marsh Posté le 23-01-2008 à 20:26:04    

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
Reply

Marsh Posté le 24-01-2008 à 10:01:59    

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 :)
 
 

Reply

Marsh Posté le 27-01-2008 à 15:14:57    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed