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.

#1 Le 16/03/2019, à 17:05

L'Africain

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

Bonjour,
Je suis en train de convertir un calendrier cvs dans un format un peut particulier l'imp qui intègre des balises xml.
Alors j'ai bricolé comme j'ai pu un script kilométrique pour convertir le cvs, mais bon ça fonctionne assez bien mais pour une raison inconnue le script ne s'exécute pas sur certaines lignes. Voici un extrait du fichier original:

"2019-04-09","Férie","violet","Nb 21,4b-9 / Ps 101,2-3.16-21 / Jn 8,21-30 "
"2019-04-10","Férie","violet","Dn 3,14-20.91-92.95 / Dn 3,52-56 / Jn 8,31-42 "
(...)
"2019-10-20","29ème dimanche du temps ordinaire","vert","Ex 17,8-13 (Les mains de Moïse) / Ps 120,1-8 (Le secours me vient du Seigneur) / 2 Tm 3,14-4,2 (Méditer et proclamer la Parole) / Lc 18,1-8 (La veuve et le juge) "
"2019-10-21","De la férie","vert","Rm 4,20-25 / Lc 1,69-75 / Lc 12,13-21 "

Je passe ce script dessus:

sed -r 's/^\"([0-9]*-)([0-9]*)-([0-9]*)\",\"([A-Z0-9].*)\","([a-z]*)\","([A-Z1-3].*) \/ (Ps [0-9]*.*) \/ ([A-Z1-3].*) \"/<\/div>\n\$\$\$\2\.\3\n<div type=\"entry\" osisID=\"\2\.\3\">\n<title>\4<hi type=\"italic\">\5<\/hi><\/title>\n<list><item>Première lecture: <reference osisRef=\"\">\6<\/reference><\/item>\n<item>\7<\/item>\n<item>\8<\/item><\/list>/g' texte.csv >text.xml

ça donne:

$$$04.09
<div type="entry" osisID="04.09">
<title>Férie<hi type="italic">violet</hi></title>
<list><item>Première lecture: <reference osisRef="">Nb 21,4b-9</reference></item>
<item>Ps 101,2-3.16-21</item>
<item>Jn 8,21-30</item></list>
"2019-04-10","Férie","violet","Dn 3,14-20.91-92.95 / Dn 3,52-56 / Jn 8,31-42 "
</div>
(...)
$$$10.20
<div type="entry" osisID="10.20">
<title>29ème dimanche du temps ordinaire<hi type="italic">vert</hi></title>
<list><item>Première lecture: <reference osisRef="">Ex 17,8-13 (Les mains de Moïse)</reference></item>
<item>Ps 120,1-8 (Le secours me vient du Seigneur) / 2 Tm 3,14-4,2 (Méditer et proclamer la Parole)</item>
<item>Lc 18,1-8 (La veuve et le juge)</item></list>
"2019-10-21","De la férie","vert","Rm 4,20-25 / Lc 1,69-75 / Lc 12,13-21 "

Sur les 365 lignes de l'année j'en ai un peu plus d'une trentaine qui refuse le traitement avec sed sad Mais comme j'ai une vingtaine de fichiers...
Merci d'avance

Dernière modification par L'Africain (Le 17/03/2019, à 20:29)


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

Hors ligne

#2 Le 16/03/2019, à 17:26

Watael

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

CSV : Comma Separated Values.

le CSV se traite avec awk.


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

Hors ligne

#3 Le 16/03/2019, à 17:34

L'Africain

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

watael a écrit :

le CSV se traite avec awk.

Mes connaissances sont réduites, je ne connais pas du tout awk.


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

Hors ligne

#4 Le 16/03/2019, à 17:51

pingouinux

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

Bonjour,
C'est bien compliqué, ton histoire…
Sans trop chercher, tu peux déjà simplifier ta commande

sed -r 's#^"([0-9]*-)([0-9]*)-([0-9]*)","([A-Z0-9].*)","([a-z]*)","([A-Z1-3].*) / (Ps [0-9]*.*) / ([A-Z1-3].*) "#</div>\n\$\$\$\2\.\3\n<div type="entry" osisID="\2\.\3">\n<title>\4<hi type="italic">\5</hi></title>\n<list><item>Première lecture: <reference osisRef="">\6</reference></item>\n<item>\7</item>\n<item>\8</item></list>#g' texte.csv >text.xml

Je pense que le problème vient de la chaîne Ps qui n'apparaît pas dans certaines lignes.
sed -r 's#^"([0-9]*-)([0-9]*)-([0-9]*)","([A-Z0-9].*)","([a-z]*)","([A-Z1-3].*) / (Ps [0-9]*.*) / ([A-Z1-3].*) "#......

Hors ligne

#5 Le 16/03/2019, à 18:10

Watael

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

mais ne l'encourage pas à utiliser sed sur des csv.

le csv définit des champs.
awk travaille sur des champs.
le csv se traite avec awk !

il n'y a rien de compliqué.
par rapport à celle de sed, la syntaxe awk est plus proche du shell.

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


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

Hors ligne

#6 Le 16/03/2019, à 18:16

pingouinux

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

@Watael #5 :
Je n'encourage pas L'Africain, mais réponds juste à sa question…:) À lui de choisir ensuite la méthode qu'il préfère.

Hors ligne

#7 Le 16/03/2019, à 18:34

Watael

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

montrer comment visser une vis cruciforme avec un tournevis plat, c'est encourager à ne pas utiliser l'outil le plus adapté.


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

Hors ligne

#8 Le 16/03/2019, à 18:40

L'Africain

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

@PInguinux
Oui la ref Ps était une des causes, j'ai simplifier ma commande ça fonctionne juste que je vois qu'il y a des variables que j'avias pas repéré ( à certains endroits il y a plus de / que prévu (normalement il n'y en a que 3 /):

sed -r 's#^"([0-9]*-)([0-9]*)-([0-9]*)","([A-Z0-9[].*)","([a-z]*)","(.*) / (.*) / (.*) "#</div>\n\$\$\$\2\.\3\n<div type="entry" osisID="\2\.\3">\n<title>\4<hi type="italic">\5</hi></title>\n<list><item>Première lecture: <reference osisRef="">\6</reference></item>\n<item>\7</item>\n<item>\8</item></list>#g' perpet.xml >test 

Merci résolu pour moi!


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

Hors ligne

#9 Le 16/03/2019, à 22:37

L'Africain

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

Watael a écrit :

montrer comment visser une vis cruciforme avec un tournevis plat, c'est encourager à ne pas utiliser l'outil le plus adapté.

Tu sais c'est pas comme ça que je risque de progresser... J'ai jamais étudier l'informatique, à la base je suis menuisier/plombier/électricien, alors je veux bien moi que awk fonctionne mieux que sed, mais je ne connais que sommairement sed donc je travaille avec l'outil qui me donne des résultat. Parce qu'avec un petit tournevis plat tu pourras viser une vis cruciforme... Avec mes petites commandes sed je peux trouver une solution. Mais propose moi une solution avec awk que tu m'expliques (si tu as du temps pour ça) je ne demande pas mieux que d'apprendre.
Pour info dans le fichier il y a 4 champs séparés par des virgules, dans le dernier champ il y a un nombre aléatoire de sous-champs séparés par des slashs qui devront être sous forme de liste dans le xml des sortie. En gros.


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

Hors ligne

#10 Le 16/03/2019, à 23:04

Watael

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

awk -F';' '{ gsub("\",\"","\";\""); gsub("\"","",$NF); n=split($NF,ar," \/ "); for(i=1;i<=n;i++)printf("\t<bla>%s</bla>\n",ar[i])}' fichier

c'est un peu plus lisible.
NF : nombre de champs
gsub: substitution globale
split : morceler

et quand ton apprenti prend ton petit tournevis plat pour visser une vis cruciforme, tu dis rien ?

Dernière modification par Watael (Le 16/03/2019, à 23:06)


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

Hors ligne

#11 Le 17/03/2019, à 08:35

L'Africain

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

Merci Watael,
Je vais essayer ça. Pour l'histoire de l'apprenti je voudrais pas commencer à débattre là, dans mon cas il n'y a pas de tournevis cruciforme c'est ça que je voulais dire, dans le sens que sed c'est mon tournevis plat, awk cruciforme: connais pas.
C'est si difficile d'accepter que je ne connais pas awk? Ton script c'est un début pour moi, mais je serais incapable de faire ça tout seul. Et j'ai pour principe de ne déranger le forum que lorsque je n'arrive vraiment pas à faire un truc mo-même, même si je sais que vous pourriez me faire ça les doigts dans le nez en 10 minutes. Avec un script tout fait en plus je n'apprendrais rien.
Encore merci pour le script.

Edit: J'ai passé le script sur le fichier, la seule chose que j'ai en sortie ce sont les sous-catégories séparées par des /, les catégories séparées par des virgules ont simplement disparues. La première catégorie (comme tu l'as vu dans le script en sed) doit être précédée par 3 $ et modifier en chiffre.chiffre puis dupliquée dans une deuxième chaîne (vois le script sed).

Dernière modification par L'Africain (Le 17/03/2019, à 08:44)


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

Hors ligne

#12 Le 17/03/2019, à 13:53

pingouinux

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

@L'Africain #8 :
Si tu ne changes pas la structure de tes données, tu peux encore simplifier

sed -r 's#.*-(.*)-(.*)","(.*)","(.*)","(.*) / (.*) / (.*) "#</div>\n$$$\1.\2\n<div type="entry" osisID="\1.\2">\n<title>\3<hi type="italic">\4</hi></title>\n<list><item>Première lecture: <reference osisRef="">\5</reference></item>\n<item>\6</item>\n<item>\7</item></list>#g' perpet.xml >test

Hors ligne

#13 Le 17/03/2019, à 14:23

L'Africain

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

Merci pinguinux, où c'est un peu plus simple... C'est quoi le # en début et fin de commande?


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

Hors ligne

#14 Le 17/03/2019, à 15:01

pingouinux

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

L'Africain #13 a écrit :

C'est quoi le # en début et fin de commande?

sed -r 's#chaine#rempl#' ...

C'est un caractère quelconque ne se trouvant ni dans chaine ni dans rempl, pour éviter de faire précéder tous les / de ces chaînes par un \.

Hors ligne

#15 Le 17/03/2019, à 16:09

L'Africain

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

Ah ok alors mon autre problème vient peut-être de là. Maintenant que j'ai réussi à traiter tous les blocs principaux, je me suis attaqué aux blocs secondaires. Ces blocs secondaires se trouve entre parenthèse (je dis juste au passage que j'ai pas réussi avec tout le dernier code simplifié mais c'est pas grave). Donc voici un bloc qui me donne un résultat bizarre:

"2019-07-07","14ème dimanche du temps ordinaire","vert","Is 66,10-14c (La joie de l'ère messianique) / Ps 65,1-7.16.20 (Acclamez Dieu, toute la terre) / Ga 6,14-18 (Notre orgueil dans la croix du Christ) / Lc 10,1-12.17-20 (La mission des 72 disciples) "

Je lui passe ça dessus:

sed -ri 's#^"(.*-)(.*)-(.*)","(.*)","(vert)","(.*) (\(.*\)) / (.*) (\(.*\)) / (.*) ((.*)) / (.*)( \(.*\)) "#\n\$\$\$\2\.\3\n<div type="entry" osisID="\2\.\3">\n<title>\4</title><div type="subSection">\5</div>\n<item>Première lecture: <reference osisRef="">\6</reference> \7</item>\n<item>Psaume: <reference osisRef="">\8</reference> \9</item>\n<item>Deuxième lecture: <reference osisRef="">\10</reference>\(\11\)</item><item>Évangile: <reference osisRef="">\12</reference>\13</item></list></div>#g' Fichier

j'ai essayé plein de truc sans les \( avec des crochets parce que les parenthèse commencent toujours avec des majuscules... Rien à faire j'obtiens ce truc:

<title>14ème dimanche du temps ordinaire</title><div type="subSection">vert</div>
<item>Première lecture: <reference osisRef="">Is 66,10-14c</reference> (La joie de l'ère messianique)</item>
<item>Psaume: <reference osisRef="">Ps 65,1-7.16.20</reference> (Acclamez Dieu, toute la terre)</item>
<item>Deuxième lecture: <reference osisRef="">2019-0</reference>(2019-1)</item><item>Évangile: <reference osisRef="">2019-2</reference>2019-3</item></list></div>

Les deux derniers numéros \12 et \13 me donne ces chiffres qui sortent de chez pas où...mais j'y suis presque...


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

Hors ligne

#16 Le 17/03/2019, à 17:12

pingouinux

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

Il faudrait que tu montres ce que tu veux obtenir.

Ajouté :
Aparemment, on ne peut utiliser que \1 à \9.

Dernière modification par pingouinux (Le 17/03/2019, à 17:25)

Hors ligne

#17 Le 17/03/2019, à 17:16

L'Africain

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

Ah oui pardon!

$$$07.07
<div type="entry" osisID="07.07">
<title>14ème dimanche du temps ordinaire</title><div type="subSection">vert</div>
<item>Première lecture: <reference osisRef="">Is 66,10-14c</reference> (La joie de l'ère messianique)</item>
<item>Psaume: <reference osisRef="">Ps 65,1-7.16.20</reference> (Acclamez Dieu, toute la terre)</item>
<item>Deuxième lecture: <reference osisRef="">Ga 6,14-18</reference> (Notre orgueil dans la croix du Christ)</item><item>Évangile: <reference osisRef="">Lc 10,1-12.17-20</reference> (La mission des 72 disciples)</item></list></div>

En fait tout est bon sauf les deux derniers item qui mettait un mauvais contenu.


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

Hors ligne

#18 Le 17/03/2019, à 17:36

pingouinux

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

J'ai complété ma réponse #16.

Il te remplace, par exemple, \10, par le contenu de \1, suivi d'un 0, ce qui donne 2019-0.

Hors ligne

#19 Le 17/03/2019, à 17:39

L'Africain

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

Ah ok il existe une autre solution? Sinon je peux toujours couper le script en deux.


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

Hors ligne

#20 Le 17/03/2019, à 18:43

pingouinux

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

En #17, je pense qu'il manque <list> quelque part.

Là ça commence à être un peu lourd avec sed, je peux te proposer une solution en python si tu veux.

Hors ligne

#21 Le 17/03/2019, à 18:44

Watael

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

et pourquoi pas en assembleur ?!


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

Hors ligne

#22 Le 17/03/2019, à 20:31

L'Africain

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

@Pinguinux, merci pour la proposition! Bah j'ai presque fini donc te prend pas la tête tu m'as déjà bien aidé. Surtout qu'il y a d'autres variables que j'ai pas mis ici (au moins 5 en plus) desquelles il faudrait tenir compte.
Merci beaucoup pour ton aide.


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

Hors ligne

#23 Le 18/03/2019, à 11:39

pingouinux

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

@L'Africain #22 :
J'avais commencé à préparer un script python, je te l'envoie quand même. Il est censé s'adapter sans modification au nombre d'items dans le dernier champ csv. La seule chose à faire est d'adapter la ligne n°6 pour ajouter les titres des nouveaux items.

tit=('Première lecture', 'Psaume', 'Deuxième lecture', 'Évangile')
$ cat le_script.py
#!/usr/bin/env python3
import re, sys

fic=sys.argv[1]
rec1=re.compile('"(.*)","(.*)","(.*)","(.*) "')
rec2=re.compile('(.*?) ?(\(.*\))?$')

tit=('Première lecture', 'Psaume', 'Deuxième lecture', 'Évangile')

def impr(tit,items):
   k=rec2.match(items)
   if k:
      ref,paren=k.groups()
      if paren==None: paren='()'
      print('<item>%s: <reference osisRef="">%s</reference> %s</item>'%(tit,ref,paren))
   else: sys.stderr.write("\n%s\n%s\n"%("Item non conforme :",items))

with open(fic) as f:
   for lig in f:
      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="subSection">%s</div>'%(ferie,coul))
      items=list(map(lambda x:x.strip(),items.split('/')))
      i=0
      print('<list>')
      for item in items:
         try: tititem=tit[i]
         except IndexError: tititem='Inconnu'
         impr(tititem,item); i+=1
      print('</list></div>')

À rendre exécutable et à lancer ainsi

./le_script.py texte.csv

Dernière modification par pingouinux (Le 18/03/2019, à 12:01)

Hors ligne

#24 Le 18/03/2019, à 14:24

L'Africain

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

@Pinguinux,
Franchement c'est trop sympa!! Là je dois partir pour plusieurs semaines, mais comme j'ai pas avancé sur l'affaire dès que j'ai du temps de libre je te ferais un retour. Et je te donnerais toutes les variables, mais la plus importante est celle du champs "vert", qui peut être blanc, rouge, violet. et là je l'encadrait par un subSection différent pour chaque couleur de telle sorte que je puisse les identifier dans le css qui va leur donner la couleur de police. subSection1 2 et 3.
Et c'est pas un devoir wink C'est pour rendre service à d'autres wink
Faudra aussi que je fasse la boucle for, parce qu'il y a une vingtaine de fichiers  à traiter.


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

Hors ligne

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

L'Africain

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

Resalut,
Bon ben finalement j'ai pas pu m'empêcher de tester, alors voilà c'est presque parfait!!
Il faut ajouter qu'il y a 3 types d'entrée:
[*]Semaines: donc trois lecture 1er, Psaume Evangile et non suivi par du texte entre parenthèse (le script actuel me met des parenthèse à la fin de la liste (Donc 2 Slash)[/*]
[*]Dimanche: 4 lectures, Première lecture, Psaume Deuxième lecture, Evangile, donc 3 slash[/*]
[*]Jour de fête, en règles générale c'est aléatoire.. autant ne rien mettre juste des <list> Donc un nombre de slash plus grand que 3 aléatoire.[/*]
Enfin comme je le disais plus haut. dans les colonnes il y en a une avec des noms de couleurs qui doivent être traités différemment, mais éventuellement c'est pas trop grave, car je peux repasser un sed dessus. C'est la troisième colonne.
Voici un exemple un peu plus complet, Dimanche, semaine jour de fête:

"2018-12-02","1er dimanche de l'Avent","violet","Jr 33,14-16 (Annonce du Messie) / Ps 24,4-5.8-10.14 (Vers toi j'élève mon âme) / 1 Th 3,12-4,2 (Se préparer pour le jour du Seigneur) / Lc 21,25-28.34-36 (La venue du Fils de l'Homme) "
"2018-12-03","St François Xavier, jésuite, missionnaire, †1552 à Sancian (Chine)","blanc","Is 2,1-5 / Ps 121,1-9 / Mt 8,5-11 "
"2018-12-04","St Jean Damascène (Mansour ibn Sarjoun), prêtre, docteur de l'Église, †749 à Jérusalem (État de Palestine / Israël)","blanc","Is 11,1-10 / Ps 71,1-2.7-8.12-13.17 / Lc 10,21-24 "
"2018-12-05","De la férie","violet","Is 25,6-10a / Ps 22,1-6 / Mt 15,29-37 "
"2018-12-25","Nativité du Seigneur","blanc","Messe de la veille Is 62,1-5 (Tu seras la joie de ton Dieu) / Ps 88,4-5.16-17.27.29 / Ac 13,16-17.22-25 (Le témoignage de Paul au sujet du Christ, fils de David) / Mt 1,1-25 (Généalogie de Jésus, Christ, fils de David) / Messe de la nuit Is 9,1-6 (Un enfant nous est né) / Ps 95,1-3.11-13 / Tt 2,11-14 (La grâce de Dieu s’est manifestée pour tous les hommes) / Lc 2,1-14 (Aujourd’hui vous est né un Sauveur) / Messe de l'aurore Is 62,11-12 (Voici ton Sauveur qui vient) / Ps 96,1.6.11-12 / Tt 3,4-7 (Dieu nous a sauvés par sa miséricorde) / Lc 2,15-20 (Les bergers découvrirent Marie et Joseph, avec le nouveau-né) / Messe du jour Is 52,7-10 (Toutes les nations le verront) / Ps 97,1-6 (Il se souvient de son amour) / He 1,1-6 (Le Fils, révélation de Dieu) / Jn 1,1-18 (Le Verbe s'est fait chair) "

Dernière modification par L'Africain (Le 18/03/2019, à 18:09)


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

Hors ligne