Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 18/03/2019, à 18:25

pingouinux

Re : [Résolu] Sed ne travaille pas sur certaines lignes

Il faudrait que tu montres le résultat que tu souhaites avec ton exemple en #25.

Hors ligne

#27 Le 18/03/2019, à 18:43

L'Africain

Re : [Résolu] Sed ne travaille pas sur certaines lignes

Résultat:

$$$12.02
<div type="entry" osisID="12.02">
<title>1er dimanche de l'Avent</title><div type="subSection3">violet</div>
<list>
<item>Première lecture : Jr 33,14-16 (Annonce du Messie)</item>
<item>Psaume : Ps 24,4-5.8-10.14 (Vers toi j'élève mon âme)</item>
<item>Deuxième lecture : 1 Th 3,12-4,2 (Se préparer pour le jour du Seigneur)</item>
<item>Évangile: Lc 21,25-28.34-36 (La venue du Fils de l'Homme)</item>
</list></div>
$$$12.03
<div type="entry" osisID="12.03">
<title>St François Xavier, jésuite, missionnaire, †1552 à Sancian (Chine)</title><div type="subSection">blanc</div>
<list>
<item>Première lecture: Is 2,1-5</item>
<item>Psaume: Ps 121,1-9</item>
<item>Évangile: Mt 8,5-11</item>
</list></div>
$$$12.25
<div type="entry" osisID="12.25">
<title>Nativité du Seigneur</title><div type="subSection">blanc</div>
<list><item>Messe de la veille</item>
<list><item>Première lecture: Is 62,1-5 (Tu seras la joie de ton Dieu)</item>
<item>Psaume: Ps 88,4-5.16-17.27.29</item>
<item>Deuxième lecture: Ac 13,16-17.22-25 (Le témoignage de Paul au sujet du Christ, fils de David)</item>
<item>Évangile: <reference osisRef="">Mt 1,1-25 (Généalogie de Jésus, Christ, fils de David)</item>  </list>
<item>Messe de la nuit</item>
<list><item> Is 9,1-6 (Un enfant nous est né)</item>
<item>Ps 95,1-3.11-13</item>
<item>Tt 2,11-14 (La grâce de Dieu s’est manifestée pour tous les hommes)</item>
<item>Lc 2,1-14 (Aujourd’hui vous est né un Sauveur)</item></list>
<item>Messe de l'aurore</item>
<list><item>I Is 62,11-12 (Voici ton Sauveur qui vient)</item>
<item>Ps 96,1.6.11-12</item>
<item>Tt 3,4-7 (Dieu nous a sauvés par sa miséricorde)</item>
<item>Lc 2,15-20 (Les bergers découvrirent Marie et Joseph, avec le nouveau-né)</item>
<item>Messe du jour</item>
<list><item>Is 52,7-10 (Toutes les nations le verront)</item>
<item>Ps 97,1-6 (Il se souvient de son amour)</item>
<item>He 1,1-6 (Le Fils, révélation de Dieu)</item>
<item>Jn 1,1-18 (Le Verbe s'est fait chair)</item></list>
</list></div>

Le problème pour "Nativité du Seigneur" c'est que d'autres fêtes auront des listes différentes. Mais tant que chaque lecture est mise en <list> c'est bien. Dans l'exemple il n'y a que deux couleurs blanc et violet, en tout il y en a 4. Autre précision, j'ai supprimé les balises <reference>, car c'est plus simple de les traiter à part, et j'ai un ami qui travaille là-dessus.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#28 Le 18/03/2019, à 19:09

Watael

Re : [Résolu] Sed ne travaille pas sur certaines lignes

 awk -F';' '{
   gsub("\",\"",";");
   gsub("\"","");
   split($1,dt,"-");
   n=split($NF,vers," /");
   date=dt[2]"."dt[3];
   printf("$$$%s\nosID: %S\nEntry: %s Subsect°: %s\n",date,date,$2,$3);
   for (i=1;i<=n;i++)print "item:",vers[i]
}' fichier1 fichier2 fichiern+1

pas testé sur plusieurs fichiers, mais a priori, ça marche...
je n'ai pas mis l'intégralité des b·a·ba·lises

KISS!

Dernière modification par Watael (Le 18/03/2019, à 19:18)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#29 Le 18/03/2019, à 20:15

pingouinux

Re : [Résolu] Sed ne travaille pas sur certaines lignes

@L'Africain #25 et #27 :
Là je ne comprends plus rien. Cet exemple que tu donnes n'a plus rien à voir avec celui donné en #15 et #17.

Hors ligne

#30 Le 18/03/2019, à 20:20

Watael

Re : [Résolu] Sed ne travaille pas sur certaines lignes

et si c'est un export d'un tableur, est-ce qu'il n'est pas possible de définir le délimiteur comme un point-virgule, et pas mettre les "cases" entre guillemets séparés par une virgule ?

Dernière modification par Watael (Le 18/03/2019, à 20:21)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#31 Le 18/03/2019, à 20:53

L'Africain

Re : [Résolu] Sed ne travaille pas sur certaines lignes

Pinguinux a écrit :

Là je ne comprends plus rien. Cet exemple que tu donnes n'a plus rien à voir avec celui donné en #15 et #17.

Oui tu as raison, le fichier est plus compliqué que ce que j'ai donné en #15 et #17, c'était entre autre raison pour laquelle je voulais pas que tu te prennes la tête pour moi (ce que je te disais en #22).
J'avais pour intention de traiter le script en 3 partie avec sed, une partie pour les fêtes, une partie pour dimanche et une autre partie pour  la semaine.
Maintenant si une autre méthode fonctionne je ne refuse pas.
@Watael: Oui ta solution est interessante au moins pour un premier traitement. Je voir ça de plus prêt pour essayer d'y comprendre quelques chose.
Pour l'export, ça vient d'une base de donnée msql je crois. Je n'ai que le CSV.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#32 Le 18/03/2019, à 21:19

L'Africain

Re : [Résolu] Sed ne travaille pas sur certaines lignes

@Watael ton script fonctionne plutôt bien. Faudrait encore ajouter la balise de fermeture </list></div> le reste (les lectures je crois que je vais laisser comme ça ou traiter autrement. Idem pour les couleurs c'est pas très compliqué. Maintenant je serais content si tu m'explique ton script en language humain comme à vieux pépé. Je l'ai déjà fait correspondre à mes besoins, et j'ai modifié une erreur de casse dans les %s:

#!/bin/bash
 awk -F';' '{
   gsub("\",\"",";");
   gsub("\"","");
   split($1,dt,"-");
   n=split($NF,vers," /");
   date=dt[2]"."dt[3];
   printf("$$$%s\n<div\ type=\"entry\"\ osisID=\"%s\">\n<title>%s<\/title><div\ type=\"subSection2\">%s<\/div>\n<list>",date,date,$2,$3);
   for (i=1;i<=n;i++)print "<item>",vers[i]"<\/item>"
   }'

Après faudra encore que je réussisse à faire ça dans une boucle...


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#33 Le 19/03/2019, à 09:39

pingouinux

Re : [Résolu] Sed ne travaille pas sur certaines lignes

Les résultats sont presque conformes à ceux de ton exemple en #25 et #27 (tu as des subSection et subSection3, est-ce volontaire ?)

$ cat le_script2.py
#!/usr/bin/env python3
import re, sys

fic=sys.argv[1]
rec1=re.compile('"(.*)","(.*)","(.*)","(.*) "')
rec2=re.compile('[A-Z]')

def impr(tit,item):
   global liste_en_cours
   tits=item.split()
   if tits[0]=='Messe':
      k=rec2.search(item[1:])
      if k:
         label=item[:k.start(0)]
         item=item[k.start(0)+1:]
         if liste_en_cours: print('</list>')
         print('<item>%s</item>\n<list>'%(label),end='')
         liste_en_cours=True
      else: sys.stderr.write("\n%s\n%s\n"%("Item non conforme :",item))
   print('<item>%s%s</item>'%(tit,item))

with open(fic) as f:
   for lig in f:
      liste_en_cours=False
      k=rec1.match(lig)
      if k: dat,ferie,coul,items=k.groups()
      else: sys.stderr.write("\n%s\n%s\n"%("Ligne non conforme :",lig)); continue
      mois_jour='.'.join(dat.split('-')[1:])
      print('$$$%s\n<div type="entry" osisID="%s">'%(mois_jour,mois_jour))
      print('<title>%s</title><div type="subSection3">%s</div>'%(ferie,coul))
      items=list(map(lambda x:x.strip(),items.split('/')))
      lon=len(items)
      if lon==3: tit=('Première lecture', 'Psaume', 'Évangile')
      else:      tit=('Première lecture', 'Psaume', 'Deuxième lecture', 'Évangile')
      i=0
      print('<list>')
      for item in items:
         try: tititem="%s: "%tit[i]
         except IndexError: tititem=''
         impr(tititem,item); i+=1
      if liste_en_cours: print('</list>')
      print('</list></div>')

Hors ligne

#34 Le 19/03/2019, à 12:37

Watael

Re : [Résolu] Sed ne travaille pas sur certaines lignes

Après faudra encore que je réussisse à faire ça dans une boucle...

awk lit tous les fichiers qui lui sont passés en arguments, sans boucle.
il peut y avoir besoin de quelques manipulations supplémentaires; ça dépend du format de sortie souhaité.
il faudra encore nous donner des exemples de fichiers et la/les sortie(s) correspondante(s) attendue(s).


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#35 Le 19/03/2019, à 16:08

L'Africain

Re : [Résolu] Sed ne travaille pas sur certaines lignes

Pingounux a écrit :

tu as des subSection et subSection3

Oui, ça permet de pouvoir distinguer les couleurs dans le fichier CSS qui permettra l'affichage du calendrier. Mais c'est pas très grave. Sinon le script actuel fonctionne très bien!

Watael a écrit :

awk lit tous les fichiers qui lui sont passés en arguments

Ok, comment on l'écrit? En entrée c'est un cvs et en sortie c'est un xml.

Merci pour votre aide!


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#36 Le 19/03/2019, à 16:36

pingouinux

Re : [Résolu] Sed ne travaille pas sur certaines lignes

@L'Africain #35 :
Si le type de subSection ne dépend que de la couleur qui suit, on peut facilement adapter le script.
On peut aussi boucler sur les fichiers dans le script : par exemple, on transforme chaque .csv du répertoire en un fichier .xml de même racine.

Hors ligne

#37 Le 19/03/2019, à 16:39

Watael

Re : [Résolu] Sed ne travaille pas sur certaines lignes

cvs : Concurrent Versions System
csv : Comma Separated Values

awk '...' fichier_1 fichier_2 fichier_n+1

comme j'ai dit, il faut voir les fichiers en entrée, et la sortie attendue.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#38 Le 19/03/2019, à 16:40

L'Africain

Re : [Résolu] Sed ne travaille pas sur certaines lignes

@Pingouinux : J'accepte volontiers la proposition smile


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#39 Le 19/03/2019, à 16:44

pingouinux

Re : [Résolu] Sed ne travaille pas sur certaines lignes

L'Africain #38 a écrit :

@Pingouinux : J'accepte volontiers la proposition

Laquelle ?
Si c'est la première, il faut que tu précises.
Si c'est la seconde, je regarde.

Hors ligne

#40 Le 19/03/2019, à 20:01

pingouinux

Re : [Résolu] Sed ne travaille pas sur certaines lignes

Ce script va générer, à partir des fichiers .csv du répertoire fourni, les fichiers .xml correspondants. Si on ne donne pas de répertoire de départ, on travaille dans le répertoire courant. Par exemple, le fichier bidule.csv va servir à générer le fichier bidule.xml.

$ cat le_script3.py
#!/usr/bin/env python3
import re, sys, glob, os

try: rep=sys.argv[1]
except IndexError: rep='.'

rec1=re.compile('"(.*)","(.*)","(.*)","(.*) "')
rec2=re.compile('[A-Z]')

def impr(g,tit,item,fic_i):
   global liste_en_cours
   tits=item.split()
   if tits[0]=='Messe':
      k=rec2.search(item[1:])
      if k:
         label=item[:k.start(0)]
         item=item[k.start(0)+1:]
         if liste_en_cours: g.write('</list>\n')
         g.write('<item>%s</item>\n<list>'%(label))
         liste_en_cours=True
      else: sys.stderr.write("\n%s => Item non conforme :\n%s\n"%(fic_i,item))
   g.write('<item>%s%s</item>\n'%(tit,item))

def csv2xml(fic_i,fic_o):
   global liste_en_cours
   with open(fic_i,'r') as f, open(fic_o,'w') as g:
      for lig in f:
         liste_en_cours=False
         k=rec1.match(lig)
         if k: dat,ferie,coul,items=k.groups()
         else: sys.stderr.write("\n%s => Ligne non conforme :\n%s\n"%(fic_i,lig)); continue
         mois_jour='.'.join(dat.split('-')[1:])
         g.write('$$$%s\n<div type="entry" osisID="%s">\n'%(mois_jour,mois_jour))
         g.write('<title>%s</title><div type="subSection3">%s</div>\n'%(ferie,coul))
         items=list(map(lambda x:x.strip(),items.split('/')))
         lon=len(items)
         if lon==3: tit=('Première lecture', 'Psaume', 'Évangile')
         else:      tit=('Première lecture', 'Psaume', 'Deuxième lecture', 'Évangile')
         i=0
         g.write('<list>\n')
         for item in items:
            try: tititem="%s: "%tit[i]
            except IndexError: tititem=''
            impr(g,tititem,item,fic_i); i+=1
         if liste_en_cours: g.write('</list>\n')
         g.write('</list></div>\n')

for fic_i in glob.glob(os.path.join(rep,'*.csv')):
   fic_o=re.sub('\.csv$','.xml',fic_i)
   sys.stderr.write("fic_i=%s\nfic_o=%s\n"%(fic_i,fic_o))
   csv2xml(fic_i,fic_o)

À appeler ainsi

./le_script3.py repertoire_de_recherche

ou pour travailler dans le répertoire courant

./le_script3.py

Hors ligne

#41 Le 19/03/2019, à 22:35

L'Africain

Re : [Résolu] Sed ne travaille pas sur certaines lignes

@PInguinux, merci, c'est parfait, donc pour la proposition que j'accepte ça devait être au pluriel à savoir les deux smile Une c'est déjà arrangé...


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#42 Le 20/03/2019, à 06:55

pingouinux

Re : [Résolu] Sed ne travaille pas sur certaines lignes

@L'Africain #41 :
Pour ce qui est du choix entre subSection et subSection3, je ne peux pas deviner. Il faut que tu indiques le critère.

Hors ligne

#43 Le 20/03/2019, à 07:20

L'Africain

Re : [Résolu] Sed ne travaille pas sur certaines lignes

C'est égal, mais faisons comme ça:
subsection : vert
subsection1 : blanc
subsection2 : violet
subsection3 : rouge


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#44 Le 20/03/2019, à 07:43

pingouinux

Re : [Résolu] Sed ne travaille pas sur certaines lignes

$ cat le_script4.py
#!/usr/bin/env python3
import re, sys, glob, os

try: rep=sys.argv[1]
except IndexError: rep='.'

rec1=re.compile('"(.*)","(.*)","(.*)","(.*) "')
rec2=re.compile('[A-Z]')

def impr(g,tit,item,fic_i):
   global liste_en_cours
   tits=item.split()
   if tits[0]=='Messe':
      k=rec2.search(item[1:])
      if k:
         label=item[:k.start(0)]
         item=item[k.start(0)+1:]
         if liste_en_cours: g.write('</list>\n')
         g.write('<item>%s</item>\n<list>'%(label))
         liste_en_cours=True
      else: sys.stderr.write("\n%s => Item non conforme :\n%s\n"%(fic_i,item))
   g.write('<item>%s%s</item>\n'%(tit,item))

def csv2xml(fic_i,fic_o):
   global liste_en_cours
   with open(fic_i,'r') as f, open(fic_o,'w') as g:
      for lig in f:
         liste_en_cours=False
         k=rec1.match(lig)
         if k: dat,ferie,coul,items=k.groups()
         else: sys.stderr.write("\n%s => Ligne non conforme :\n%s\n"%(fic_i,lig)); continue
         mois_jour='.'.join(dat.split('-')[1:])
         g.write('$$$%s\n<div type="entry" osisID="%s">\n'%(mois_jour,mois_jour))
         if   coul=="vert":   n_subsec=""
         elif coul=="blanc":  n_subsec="1"
         elif coul=="violet": n_subsec="2"
         elif coul=="rouge":  n_subsec="3"
         else:
            n_subsec="?"
            sys.stderr.write("\n%s => Couleur non prévue : %s\n%s\n"%(fic_i,coul,lig));
         g.write('<title>%s</title><div type="subSection%s">%s</div>\n'%(ferie,n_subsec,coul))
         items=list(map(lambda x:x.strip(),items.split('/')))
         lon=len(items)
         if lon==3: tit=('Première lecture', 'Psaume', 'Évangile')
         else:      tit=('Première lecture', 'Psaume', 'Deuxième lecture', 'Évangile')
         i=0
         g.write('<list>\n')
         for item in items:
            try: tititem="%s: "%tit[i]
            except IndexError: tititem=''
            impr(g,tititem,item,fic_i); i+=1
         if liste_en_cours: g.write('</list>\n')
         g.write('</list></div>\n')

for fic_i in glob.glob(os.path.join(rep,'*.csv')):
   fic_o=re.sub('\.csv$','.xml',fic_i)
   sys.stderr.write("fic_i=%s\nfic_o=%s\n"%(fic_i,fic_o))
   csv2xml(fic_i,fic_o)

Dernière modification par pingouinux (Le 20/03/2019, à 07:43)

Hors ligne