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

Shell et commandes GNU Discussion :

Parcourir un fichier pour traiter des informations


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut Parcourir un fichier pour traiter des informations
    Bonjour , voila ce que j 'essaye de faire , j'ai un fichier sous cette forme

    Fichier en entré : test.ai en format fixe sans séparateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    010020000000                          L ABERGEMENT DE VAREY           T                   01640    1009
    010040000000                         AMBERIEU EN BUGEY                   T                   01500
    010040000100 BOISSIEU          ALL  ALLEE                      0000 0000 0000 0000 015002005A    002206
    010040000200 ETRAC               ALL  ALLEE                      0000 0000 0000 0000 015001018A    002206
    010040000300 BARBOTIERE      ALL  ALLEE                      0000 0000 0000 0000 015001018B    002206
    010040000500 PANISSETTE      ALL  ALLEE                       0000 0000 0000 0000 015001018A    002206
    Je veux vérifier pour chaque ligne de mon fichier si je trouve la valeur 'T' en colonne 71 et si en colonne 100 nous avons une valeur renseignée.
    Par ex : si je prends la première ligne de mon fichier ci-dessus : j'ai bien la valeur T et en colonne 100 : la valeur 1009 donc c parfait
    Si cette condition est vraie , je veux vérifier pour la ligne suivante l'absence de la valeur 'T' en colonne 71 . Or dans mon exemple j'ai en ligne 2, la colonne 71 qui est renseignée avec la valeur 'T' . J'aimerais récupérer dans mon fichier toutes les lignes qui ne remplisse pas ces conditions .
    Le résultat de mon traitement serait donc que je pourrais stocker dans un fichier :

    Résultat attendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    010020000000 L ABERGEMENT DE VAREY T 01640 1009

    J'ai écrit un code qui fonctionne mais du tout performant car avec la commande while à chaque fois je parcours tout le fichier , y a certainement bcp à faire , je n 'arrive pas à indiquer à la commande getline la ligne à partir de laquelle , il peut commencer à parcourir le fichier au lieu de recommencer à la premiere ligne

    voici mon code


    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
    awk ' { 
    ql=substr($0,100,4);
    commune=substr($0,71,1);
    ligne=$0;
    i=i+1;
    cpt=0;
    commune1=0;
    j=0;
    if (commune=="T" && ql>0 )
    {
    	while ((getline  < "test.ai") > 0 ) 
    	{
    		j=j+1
    		# si la ligne du awk et egal à celle du while alors je mets mon variable a 1
    		if (ligne==$0)
    		{		
    			cpt=1
    		}
    		# je recupere dans le while celle qui vient juste apres le awk pour recuperer la valeur
    		if (j==i+1){
    			commune1=substr($0,71,1);
    		}
    		# si la ligne n+1 du awk contient la valeur T en position 71 alors je l'affiche dans le fichier de sortie et j'arrete le while pour traiter la ligne suivante dans le awk
    		if (cpt==1 && commune1=="T")
    		 {
    			print "ligne:" ligne 		
    			break
    		}
     
    	}
    	close ("test.ai")
    }
    }' test.ai > res.ai

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour,

    en fait, à la colonne 100, il y a un 1; le champ qui commence à la ligne 100, et qui est constitué d'au moins 4 caractères (apparemment), contient la valeur 1009.

    si tu peux utiliser GNUawk (gawk), il dispose d'une variable qui va te permettre de simplifier ton code : FIELDWIDTHS. Il faut connaître la longueur des champs, et évenutellement le nombre d'espaces qui les sépare.

    pour ton problème, tu peux utiliser un drapeau; il s'agit d'une variable qui vaudra 1 (vrai) ou 0 (faux) selon la condition voulu (ici, la ligne contient T), qui sera vérifiée à la ligne suivante, et réassignée selon la même condition.
    ça va considérablement alléger ton nouveau script.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Parcourir une liste pour transférer des fichiers
    Par emulamateur dans le forum VBA Access
    Réponses: 4
    Dernier message: 16/09/2011, 14h31
  2. parcourir un fichier XML pour recuperer des information
    Par samerkouta dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 05/10/2009, 11h02
  3. le meilleur langage pour traiter des gros fichiers xml
    Par hansaplast dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 06/07/2009, 22h35
  4. Réponses: 11
    Dernier message: 08/10/2007, 13h15
  5. Réponses: 8
    Dernier message: 13/07/2006, 01h17

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