Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/01/2011, 23h33   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 51
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 51
Points : 13
Points : 13
Par défaut Shell Parser fichier

Bonsoir à tous,

Voilà depuis quelques heures que je cherche désespérément à savoir comment parser un fichier via en script ksh.

Mon fichier d'entrée est le suivant :

Citation:
++
CATEGORIE 1

==
Sous catégorie 1

aaa
bbb
cc

==
Sous catégorie 2

dd
ffff
yyy

++
CATEGORIE 2
...
J'aimerai donc bien pouvoir récupérer les différentes parties de mon fichiers.

Exemple Catégorie1= CATEGORIE1
ss_catgorie1=aaa
bbb
ccc

etc...
Je viens donc quémander votre aide cher développeur.

En vous remerciant,
twixi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 01h12   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
Citation:
comment parser un fichier via en script ksh
de la même manière qu'en bash probablement; regarde ici...

Après, ton plus gros problème est de décider quelle action effectuer selon que la ligne lue vaut tant ou tant.

tu as peut-être déjà pensé à quelque chose
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/01/2011, 07h41   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 51
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 51
Points : 13
Points : 13
Bonjour N_BaH,

J'avais bien vu ton post, mais mon problème vient du fait qu'il n'est pas obligatoire que j'aie de sous catégories dans mon fichier :/
Peut-être faut-il penser à un autre manière de délimiter mes fichiers?

Effectivement, j'ai pensé à l'utilisation du awk.
Je décompose mes CATEGORIE en plusieurs fichiers via la commande :

Citation:
file='categorie.log'
awk '/^"++"/{close f; f=""} f{print > f} /^"++"/{f="doc."++d}' ${file}
Sauf que cette commande ne fonctionne pas avec des caractères spéciaux que j'ai choisi pour délimiter mes catégories (++) . En effet, avec un BEGIN - END à la fin de chaque CATEGORIE cela pourrait fonctionner.

Ma question : Cela pourrait-il fonctionner avec caractères spéciaux?

Merci
twixi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 08h18   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
Bonjour,

Code :
1
2
3
4
5
6
#!/usr/bin/ksh
 
while read line
do [ "$line" = "++" ] && output="doc.$((++n))"
   echo "$line" >> "$output"
done < ton_fichier.log
cela pourrait-il être tout ce que tu demandes ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/01/2011, 00h22   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 51
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 51
Points : 13
Points : 13
Bonsoir N_BaH,

Effectivement, cela pourrait coller, comme quoi il ne fallait pas chercher trop loin.
Afin de faciliter le parsing du fichier j'ai décidé de modifier le contenu du fichier

Citation:
++ categorie 1
aa bb cc
aa bb cc

++categorie 2
= sous categorie 21
aa aa
bb bb

= sous categorie 22
cc dd
Je te fais part de l'algorithme général que je compte apporter grâce à ton aide:

1 - Découpe du fichier log en plusieurs doc.* correspondant aux catégories
2 - parcourir chaque doc.* pour en extraire les variables.
a. pour tous les fichiers doc.* lecture ligne à ligne
b. si deux premiers caractères = "++" alors v_CATEGORIE=ligne
c. si deux premiers caractères = "=" alors v_SS_CATEGORIE=ligne
d. sinon cela correspond au données

ce qui donne pour l'instant :

Citation:
while read line
do [ "${line:0:2}" = "++" ] && output="doc.$((++n))"
echo "$line" >> "$output"
done < monfichier.log




j=0
k=0
while read line
do
if [ "${line:0:2}" = "++" ] ; then
data=""
varsc=""
k=0
let j=$j+1
typeset categorie$j="$line"


elif [ "${line:0:1}" = "=" ] ; then
data=""
let k=$k+1
varsc=$j"_"$k
typeset sscategorie${varsc}="$line"

elif [ "${line:0:3}" != "" ] ; then
typeset data="$data""$line
"
if [ "$varsc" = "" ];then
typeset "data$j"="$data"
else
typeset "data$varsc"="$data"
fi

fi

done < monfichier.log
Peut-être que cette méthode est trop brouillon ?

Dans l'attente de ton avis sur le sujet,

Merci d'avance !
twixi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 02h43   #6
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
c'est typeset pour déclarer des variables, et pas set

J'aimerais bien savoir ce qui se passe en amont : le script qui produit ce log
et pourquoi tu dois retraiter le log, plutôt que d'avoir un log dans le format que tu veux...

d'ailleurs, quel est exactement le format voulu ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/01/2011, 08h07   #7
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 51
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 51
Points : 13
Points : 13
Bonjour N_BAH,

Pour être plus concret, voici ce qu'il se passe en amont:

Un script SQL est exécuté. Celui-ci se présente ainsi :

Citation:
PROMPT ++ CATEGORIE
PROMPT = SS_CATEGORIE

select champs1, champs2, champs3 from table1 where table_name like %toto%;

PROMPT = SS_CATEGORIE
select champs1, champs2, champs3 from table2 where table_name like %toto%;

PROMPT ++ CATEGORIE
PROMPT = SS_CATEGORIE
select champs1, champs2, champs3 from table2 where table_name like %toto%;
...
Résultat possible dans la log:
Citation:
++ CATEGORIE
= SS_CATEGORIE

aa bb cc
cc dd ee

2 rows selected.

++ CATEGORIE

aa bb cc

1 rows selected.

++ CATEGORIE
++ SS_CATEGORIE
aa bb cc

1 rows selected.
J'aimerais donc récupérer l'ensemble de ces informations pour en créer un fichier html afin de mieux présenter la fichier Log.
twixi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 14h33   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
Je pense à créer un fichier xml, d'abord :

Code pseudo code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#tant que je lis une ligne du fichier.log
#si la ligne commence par ++
#alors
#	si une balise ssKt a été ouverte je la ferme, et je supprime le drapeau afférent
#	si une balise kT a été ouverte, alors je la ferme, et je supprime le drapeau afférent finsi
#	j'ouvre une balise kT, et je valorise un drapeau kT
#	j'écris la ligne
#autresi la ligne commence par =
#alors
#	si une balise ssKt a été ouverte je la ferme, et je supprime le drapeau afférant
#	j'ouvre une balise ssKt, et je valorise un drapeau ssKt
#	j'écris la ligne
#autre
#	si la ligne n'est pas vide, et si la ligne ne commence pas par un chiffre
#	alors
#		j'ouvre une balise "unique" produit
#		j'écris la ligne
#	finsi
#finsi
ce qui donnerait, genre :
Code :
1
2
3
4
5
<categorie id="CATEGORIE">
   <ss-categorie id="SSCATEGORIE">
      <produit id="PRODUIT"/>
   </ss-categorie>
</categorie>
un fichier xml, quoi...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h24.


 
 
 
 
Partenaires

Hébergement Web