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

Unix Discussion :

Lecture en parallèle ou Accès direct aux données d'un fichier


Sujet :

Unix

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut Lecture en parallèle ou Accès direct aux données d'un fichier
    Bonjour

    Je dois compléter un fichier à partir des données d'un second.
    Le script que j'ai développé actuellement
    - lit en séquence le premier fichier
    - pour chaque enregistrement du premier fichier, boucle sur les enregistrements du second jusqu'à trouver une clé identique
    - si une clé identique est trouvée, récupération des informations souhaitées et écriture d'une ligne dans le fichier de sortie
    - sinon, écriture de la ligne d'origine dans le fichier de sortie, sans complément

    La durée de traitement est assez longue, je suppose parce que je lis n fois le second fichier du début à la fin (ou a minima jusqu'à ce que je trouve une clé identique)

    Pourriez-vous m'indiquer quel autre moyen, plus efficace, je peux mettre en place pour que le traitement dure moins longtemps (et qu'il soit fonctionnellement plus "correct", car lire n fois le même fichier dans le même traitement ...).
    Malgré mes recherches, et certains exemples théoriques trouvés sur internet, je n'ai pu réussir à mettre en place une lecture en parallèle des deux fichiers, ni un fonctionnement par tableau permettant un accès direct.

    Merci par avance pour vos contributions.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut
    Ci-dessous le script actuel : (ficent_1 est le fichier principal, ficent_2 est le fichier dans lequel je vais chercher les informations complémentaires, ficsor est le fichier de sortie)

    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
    39
    40
    41
    42
    43
    44
     
    ##heure_execution=`date '+%Y%m%d%H%M%S'`
    heure_debut=`date '+%H%M%S'`
    echo "Debut : " ${heure_debut}
     
    rm ficsor
    touch ficsor
     
    while true
    do
    	read enr_fic1 
    	if [ "${enr_fic1}" = "" ]
    	   then 
    	   	   break
    	else
    	   echo ${enr_fic1} | crit_fic1=$(awk -F\; '{ print $3 $10}')
    	   echo "crit_fic1 : " ${crit_fic1}
    	   eureka=0
    	   while read enr_fic2
    	   do
    	   	 echo ${enr_fic2} | temp_crit_fic2=$(awk -F\; '{ print $1 $2}')
    	   	 if [ "${enr_fic2}" = "" ]; then break; fi
    	   	 crit_fic2=$(echo ${temp_crit_fic2} | sed -e "s/\ //g")
    	   	 ##echo "   crit_fic2 : " ${crit_fic2}
    	   	 if [ "${crit_fic1}" = "${crit_fic2}" ]
    	   	 	  then
    	   	 	  	echo "Eureka"
    	   	 	  	eureka=1
    	   	 	  	echo ${enr_fic1} "SACFT : " ${temp_crit_fic2} " ; " >> ficsor
    	   	 	  	break
    	   	 fi
    	   done < ficent_2
         heure_fin=`date '+%H%M%S'`
         echo "   Fin boucle fichier 2 : " ${heure_fin} " ( " ${heure_debut} " ) "
         if [ "${eureka}" = 0 ]
         	  then
    	   	 	  	echo ${enr_fic1} " ; "                   >> ficsor	  	
    	   fi
    	fi
     
    done < ficent_1
     
    heure_execution=`date '+%H%M%S'`
    echo "Fin   : " ${heure_execution}

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    t'as la possibilité de fournir des fichiers de tests et le résultat attendu stp ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut
    Voici les fichiers entrée (ficent_1 puis ficent_2) / sortie (ficsor)
    Je n'ai pas réussi à les mettre en pièce-jointe (message d'erreur), donc je les livre entre balises CODE.
    Dans ficsor (3ème fichier) : en gras les informations ajoutées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    XYZ00;;XYZ00A;Programme;BANALISE;BANALISE;1;1;BANALISE;DG06;BDD;I;Entree; ;V1; ; ;PAS DE DESTINATION OU ORIGINE          ;;
    XYZ02;;XYZ02A;Programme;BANALISE;BANALISE;1;1;BANALISE;DG06;BDD;I;Entree; ;V1; ; ;PAS DE DESTINATION OU ORIGINE          ;;
    XYZ02;;XYZ02A;Programme;BANALISE;BANALISE;1;1;BANALISE;FVGT;Fichier;I;Entree; ;FV;CCABC; ;PAS DE DESTINATION OU ORIGINE          ;;
    DEF01;;DEF01A;Programme;SHELL;SHELL;1;1;SHELL ;FVIP;Fichier;I;Entree; ;AA;ABC; ;PAS DE DESTINATION OU ORIGINE          ;;
    DEF01;;DEF01A;Programme;SHELL;SHELL;1;1;SHELL ;FVIP;Fichier;O;Sortie; ;BB; ; ;PAS DE DESTINATION OU ORIGINE          ;;
    DEF01;;DEF01A;Programme;SHELL;SHELL;1;1;SHELL;FVIP;Fichier;O;Sortie; ;BB; ;ABC;CAISSE ABC                             ;;
    DEF01;;DEF01A;Programme;BANALISE;BANALISE;2;1;BANALISE;DB01;BDD;I;Entree; ; ; ; ;PAS DE DESTINATION OU ORIGINE          ;;
    KLM01;;KLM01A;Programme;BANALISE;BANALISE;1;1;BANALISE;DG06;BDD;I;Entree; ; ; ; ;PAS DE DESTINATION OU ORIGINE          ;;
    BMW11;;BMW11A;Programme;BANALISE;BANALISE;1;1;BANALISE;FVGV;Fichier;I;Entree; ;FV;CITI; ;PAS DE DESTINATION OU ORIGINE          ;20080122;
    BMW11;;BMW11A;Programme;BANALISE;BANALISE;1;1;BANALISE;FVIA;Fichier;T;Tri (temporaire); ;S1; ; ;PAS DE DESTINATION OU ORIGINE          ;20080122;
    KAWA9;;KAWA9A;Programme;BANALISE;BANALISE;1;1;BANALISE;DG06;BDD;I;Entree; ; ; ; ;PAS DE DESTINATION OU ORIGINE          ;;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    XYZ00A ;   ; Aucun fichier dans SAS ;
    XYZ02A ; FVGT ; /SAS/RECV/ ;
    DEF01A ; FVIP ; /SAS/RECV/ ;
    DEF01B ;   ; Aucun fichier dans SAS ;
    DEF01C ;   ; Aucun fichier dans SAS ;
    KLM01A ;   ; Aucun fichier dans SAS ;
    BMW11A ; FVGV ; /SAS/RECV/ ;
    KAWA9A ;   ; JCL non trouve ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    XYZ00;;XYZ00A;Programme;BANALISE;BANALISE;1;1;BANALISE;DG06;BDD;I;Entree; ;V1; ; ;PAS DE DESTINATION OU ORIGINE ;;  ; 
    XYZ02;;XYZ02A;Programme;BANALISE;BANALISE;1;1;BANALISE;DG06;BDD;I;Entree; ;V1; ; ;PAS DE DESTINATION OU ORIGINE ;;  ; 
    XYZ02;;XYZ02A;Programme;BANALISE;BANALISE;1;1;BANALISE;FVGT;Fichier;I;Entree; ;FV;CCABC; ;PAS DE DESTINATION OU ORIGINE ;; SACFT :  XYZ02A FVGT  ; 
    DEF01;;DEF01A;Programme;SHELL;SHELL;1;1;SHELL ;FVIP;Fichier;I;Entree; ;AA;ABC; ;PAS DE DESTINATION OU ORIGINE ;; SACFT :  DEF01A FVIP  ; 
    DEF01;;DEF01A;Programme;SHELL;SHELL;1;1;SHELL ;FVIP;Fichier;O;Sortie; ;BB; ; ;PAS DE DESTINATION OU ORIGINE ;; SACFT :  DEF01A FVIP  ; 
    DEF01;;DEF01A;Programme;SHELL;SHELL;1;1;SHELL;FVIP;Fichier;O;Sortie; ;BB; ;ABC;CAISSE ABC ;; SACFT :  DEF01A FVIP  ; 
    DEF01;;DEF01A;Programme;BANALISE;BANALISE;2;1;BANALISE;DB01;BDD;I;Entree; ; ; ; ;PAS DE DESTINATION OU ORIGINE ;;  ; 
    KLM01;;KLM01A;Programme;BANALISE;BANALISE;1;1;BANALISE;DG06;BDD;I;Entree; ; ; ; ;PAS DE DESTINATION OU ORIGINE ;;  ; 
    BMW11;;BMW11A;Programme;BANALISE;BANALISE;1;1;BANALISE;FVGV;Fichier;I;Entree; ;FV;CITI; ;PAS DE DESTINATION OU ORIGINE ;20080122; SACFT :  BMW11A FVGV  ; 
    BMW11;;BMW11A;Programme;BANALISE;BANALISE;1;1;BANALISE;FVIA;Fichier;T;Tri (temporaire); ;S1; ; ;PAS DE DESTINATION OU ORIGINE ;20080122;  ; 
    KAWA9;;KAWA9A;Programme;BANALISE;BANALISE;1;1;BANALISE;DG06;BDD;I;Entree; ; ; ; ;PAS DE DESTINATION OU ORIGINE ;;  ;

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    plusieurs choses :
    • avec les fichiers d'entrée que tu fournis on ne tombe pas sur le résultat que tu attends (ou très partiellement)
    • il y a aussi la question des espaces, dans les résultats on voit le critère XYZ02A FVGT par exemple, sauf que si on effectue comme tu le fais dans ton code une concaténation via un awk '{print $3 $10}' il n'y a aucun espace dans le critère que l'on récupère
    • quant à ton code initial ne peut absolument pas fonctionner, il comporte entre autres des hérésies du genre echo | var=$(...)
    • ce serait sans doute bon de préciser la taille réelle des fichiers, est-ce qu'ils peuvent éventuellement tenir en mémoire ou est-ce que ce n'est pas souhaitable (l'un des deux, les deux, aucun ?)
    • dans tous les cas le traitement n'est pas vraiment simple, l'emploi d'un script shell est-il obligatoire ?


    il serait bon de détailler un peu mieux le format des fichiers en entrée, particulièrement ce que l'on peut se permettre ou non de faire avec (mettre en mémoire, virer les espaces superflus, éventuellement, obligatoirement, sous aucun prétexte etc.)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut
    J'obtenais bien le résultat attendu avec mon script et les fichiers "réels".
    C'est peut-être en créant les fichiers de test que j'ai loupé quelque chose. Pourtant, j'avais exécuté mon script avec ces fichiers et ça avait fonctionné ...

    Finalement, mon traitement shell s'étant interrompu car ayant consommé trop de CPU, je me suis rabattu sur une valeur sûre : le COBOL (je sais, je sais, ça fait un peu vieux ...).
    Et j'ai obtenu mon résultat en moins d'une minute d'exécution.

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    J'ai lu en diagonale mais la commande qui semble faire le job est :
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    quant à ton code initial ne peut absolument pas fonctionner, il comporte entre autres des hérésies du genre echo | var=$(...)
    Non, c'est une construction tout à fait valide en ksh qui est souvent le shell standard des "Autres systèmes → Unix".
    ɹǝsn *sıɹɐlos*

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Bonjour,

    Sinon, un awk qui peut éventuellement fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; 'FNR == NR {gsub(/^ *| *$/,"",$1);gsub(/^ *| *$/,"",$2);A[$1$2]=$1" "$2;next};A[$3$10] {$0=$0"SACFT : "A[$3$10]" ;"}1' ficent_2 ficent_1
    Ici, on charge tout le fichier 2 en mémoire et ensuite on traite le fichier 1.
    Cordialement.

Discussions similaires

  1. jsp mysql accès concurrents aux données
    Par elpeygey dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 26/04/2007, 14h03
  2. Gérer l'acces direct aux tables suivant les utilisateurs
    Par kristof33 dans le forum Sécurité
    Réponses: 2
    Dernier message: 02/03/2007, 08h11
  3. Interdire l'acces directe aux fichiers php
    Par Never dans le forum Apache
    Réponses: 4
    Dernier message: 04/12/2006, 21h00
  4. htaccess : interdire l'accès direct aux fichiers php
    Par Cédricss dans le forum Apache
    Réponses: 5
    Dernier message: 08/10/2006, 11h29
  5. [TOMCAT] Comment empêcher l'accès direct aux fichiers
    Par thomine dans le forum Tomcat et TomEE
    Réponses: 17
    Dernier message: 14/04/2005, 10h19

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