17 mai 2013

Script awk pour convertir le compte rendu RBM / NRB standard en csv

Les comptes rendus des chaînes RBM et NRB ont souvent quelques longueurs ... Ci joint un script awk d'un collègue pour extraire les erreurs et convertir le listing de la mise a jour batch au format CSV. Merci à lui.

A noter : le compte rendu de BMM (RBM950IZ ou NRB322IZ.$nupro) liste les dossiers dont la mise a jour est en erreur. Pour avoir un bilan complet il ne faut pas oublier :
  • Le compte rendu de BMI (RBM150IZ ou NRB150IZ.$nupro) qui liste les bordereaux rejetés (informations non gérées par le processus, formats invalides),
  • Le compte rendu de BME (RBM212IZ ou NRB212IZ.$nupro) qui liste les dossiers à recycler (dossiers dont les contrôles ont été passés mais dont la mise a jour a été "rollbackée" avec celle d'un dossier en erreur) ou l'identifiant du dernier dossier traité (en cas d'arrêt brutal du programme),
  • Le log qui va lister les erreurs SQL graves sources d'un rollback (table absente, tablespace plein, clef en double ...),
A conpléter par le fait :
  • Que le contenu du compte rendu de BMM peut être filtré par les cartes paramètre PA87/PA88 de la demande ZO,
  • Que ce compte rendu peut ne pas être produit en cas d'incident sur la chaîne (kill, macro-processus déphasées, disque plein ...).

On mesure ici la simplicité de l'exploitation de cette chaîne ...



echo "matricule;information;poids;traitement;dictionnaire;rubrique;zone libre;code erreur;libelle;"

cat ${LIS}/NRB322IZ.${nupro} | awk ' BEGIN {
        matricule=""
        typAno=""
        editAno="Complet"
}
{
 if (substr($0,33,14) == "CLE DU DOSSIER")      { matricule = substr($0, 51, 33) }
 if (substr($0,4,11) == "INFORMATION")          { info = substr($0,18,25) }
 if (index($0,"Gravité : ") > 0)                { typAno = substr($0,72,15) }
 if (index($0,"I  Groupe de traitement :") > 0) { trt=substr($0,27,2) " " substr($0,48,6) }
 if (index($0,"I  Structure de données :") > 0) { dico=substr($0,index($0,"Structure de données : ")+23,2)
      if (index($0,"Code information : ") > 0 ) { dico=dico " " substr($0,index($0,"Code information : ")+19,2)}
      if (index($0,"Rubrique : ") > 0 )         { rubr=substr($0,index($0,"Rubrique : ")+11,6)}
      if (index($0,"Zone libre : ") > 0 )       { zlib=substr($0,index($0,"Zone libre : ")+13,30)}
 }
 if (index($0,"I  Code erreur :") > 0) {
      coderr=substr($0,18,6)
      sub(/[ \t]+Li/, "", coderr)
      reste=substr(substr($0,20),index(substr($0,20),":")+1,80)
      sub(/^[ \t]+/, "", reste)
      coderr=coderr ":" reste
 }
 if (index($0,"I  Libelle     :") > 0)          { libel = substr($0,18,80) }

 if (index($0,"I                        ") > 0) {
   if (typAno != "") {
     if ((editAno == "Complet") || (typAno == "Erreur         " )) {
       sub(/[ \t]+$/, "",matricule)
       sub(/[ \t]+$/, "",typAno)
       sub(/[ \t]+$/, "",trt)
       sub(/[ \t]+$/, "",dico)
       sub(/[ \t]+$/, "",rubr)
       sub(/[ \t]+$/, "",zlib)
       sub(/[ \t]+$/, "",coderr)
       sub(/[ \t]+$/, "",libel)
       printf("%s;%s;%s;%s;%s;%s;%s;%s;%s\n",matricule,info,typAno,trt,dico,rubr,zlib,coderr,libel)
     }
     typAno=""
     trt=""
     dico=""
     rubr=""
     zlib=""
     coderr=""
     libel=""
     empl=""
   }
 }
}'


Exemple de résultat :

001DIGIX01;DV Congés payés          ;Erreur;;ZY DV;RDMOT2;E01;P:Erreur sur mouvement          Rubrique absente ou présente à tort;
001DIGIX02;DV Congés payés          ;Erreur;V1 0DVB;;;;0DVB06:0DVB/JD/SOLDE<0/HP;Solde déjà négatif avant l'imputation des absences
001DIGIX03;DV Congés payés          ;Erreur;V1 0DVB;;;;0DVB05:0DVB/UW/PTR.IMP/HP;Solde des congés négatif ou nul : Impossible d'imputer une absence..

Aucun commentaire:

Enregistrer un commentaire