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 17/06/2016, à 13:13

L'Africain

Modifier fichier xml en duplicant contenu

Bonjour,
J'ai un fichier xml, dans lequel j'ai un certains de nombre d'erreurs que je voudrais corriger automatiquement mais je ne sais pas si c'est possible. Alors voilà ce que je souhaiterais faire. J'ai ceci :

osisRef="Lk.">(Lc 6, 29-30)

ou ceci:

osisRef="Mk.">(Mc 1,22; Lc 4,32)

et je voudrais ajouter ce qu'il y a entre parenthèse, après le . qui suit soit Mk ou Lk, exemple:

osisRef="Lk.6.29-30">(Lc 6, 29-30)
osisRef="Mk.1.22 Lk.4.32">(Mc 1,22; Lc 4,32)

La différence entre ce qui est entre parenthèse et ce que je veux ajouter précédemment c'est que les virgules et les espaces deviennent des points. les point-virgules deviennent des espaces et les c deviennent des k. Mais ce dernier problème est moins important car je peux facilement modifier plus tard "Mc. par "Mk. avec sed.
Je ne sais pas si c'est possible. J'espère n'avoir pas trop mal décrit mon problème.
Merci d'avance,


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

Hors ligne

#2 Le 17/06/2016, à 14:35

pingouinux

Re : Modifier fichier xml en duplicant contenu

Bonjour,
Il faudrait que tu précises, parce qu'avec ce que tu demandes en #1, tu devrais obtenir ceci :

osisRef="Lk.Lk.6..29-30">(Lc 6, 29-30)
osisRef="Mk.Mk.1.22 .Lk.4.32">(Mc 1,22; Lc 4,32)

Hors ligne

#3 Le 17/06/2016, à 16:26

L'Africain

Re : Modifier fichier xml en duplicant contenu

ok, on peut considérer que le mk et le lk n'est pas dans la ligne à traiter si c'est plus facile. Car c'est déjà une transformation que j'ai fait manuellement avec sed pensant que ça serait plus simple pour le reste. Donc je récapitule voici le fichier original :

osisRef="">(Lc 6, 29-30)

et voici ce que j'aimerais bien :

osisRef="Lk.6.29-30">(Lc 6, 29-30)

Sachant que les chiffres sont à chaque fois différents.
Merci pour ton aide !

Dernière modification par L'Africain (Le 17/06/2016, à 16:28)


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

Hors ligne

#4 Le 17/06/2016, à 16:29

pingouinux

Re : Modifier fichier xml en duplicant contenu

Dans ce cas, essaye ceci :

awk -F '["()]' '/osisRef=/{mod=$4;gsub("; *",";",mod);gsub(", *",".",mod);gsub(" ",".",mod);gsub(";"," ",mod);gsub("c","k",mod);printf("%s\"%s\"%s(%s)\n",$1,mod,$3,$4)}' fichier

Hors ligne

#5 Le 17/06/2016, à 17:04

L'Africain

Re : Modifier fichier xml en duplicant contenu

Ça fonctionne pas :

...@W54:/home...SFM_officiel_sword$ awk -F '["()]' '/osisRef=/{mod=$4;gsub("; *",";",mod);gsub(", *",".",mod);gsub(" ",".",mod);gsub(";"," ",mod);gsub("c","k",mod);printf("%s\"%s\"%s(%s)\n",$1,mod,$3,$4)}' NYM.osis.xml 
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
...

Mais rien de changer dans le fichier.


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

Hors ligne

#6 Le 17/06/2016, à 17:10

pingouinux

Re : Modifier fichier xml en duplicant contenu

Ton fichier ne semble pas ressembler à ton exemple de départ, sur lequel j'ai testé ma commande.
Il faut que tu montres un exemple réaliste.

Hors ligne

#7 Le 17/06/2016, à 19:27

L'Africain

Re : Modifier fichier xml en duplicant contenu

Je n'ai mis qu'une partie de la ligne peut-être est-ce là le problème? Au cas où c'est ça voici deux lignes complètes :

<title type="parallel"><reference osisRef="">(Mc 1,40-45; Lc 5,12-14)</reference></title>

et:

<title type="parallel"><reference osisRef="">(Lc 13,23-24)</reference></title>

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

Hors ligne

#8 Le 17/06/2016, à 19:56

pingouinux

Re : Modifier fichier xml en duplicant contenu

Je n'ai mis qu'une partie de la ligne peut-être est-ce là le problème?

Évidemment.

awk -F '[()]' '/osisRef=/{mod=$2;gsub("; *",";",mod);gsub(", *",".",mod);gsub(" ",".",mod);gsub(";"," ",mod);gsub("c","k",mod);gsub("\"\"","\""mod"\"",$1);printf("%s(%s)%s\n",$1,$2,$3)}' fichier

Hors ligne

#9 Le 17/06/2016, à 20:15

L'Africain

Re : Modifier fichier xml en duplicant contenu

Ok ça marche mais dans le fichier de sortie il ne reste plus que les lignes concerné par la modification, toutes les autres lignes ont disparues?? Avec awk y a-t-il une option -i comme avec sed?

Dernière modification par L'Africain (Le 17/06/2016, à 20:16)


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

Hors ligne

#10 Le 17/06/2016, à 20:24

pingouinux

Re : Modifier fichier xml en duplicant contenu

J'en ai profité pour améliorer un peu la commande.

awk -F '[()]' '/osisRef=/{mod=$2;gsub("; *",";",mod);gsub(", *",".",mod);gsub(" ",".",mod);gsub(";"," ",mod);gsub("c","k",mod);gsub("Ref=\"[^\"]*\"","Ref=\""mod"\"")}{print}' fichier

Hors ligne

#11 Le 17/06/2016, à 20:38

L'Africain

Re : Modifier fichier xml en duplicant contenu

Ça fonctionne à merveille incroyable ! Si je peux le faire travailler directement sur le fichier genre avec un -i... ça serait top. Mais sinon c'est déjà super.
Un grand merci pingouinux!


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

Hors ligne

#12 Le 17/06/2016, à 20:50

pingouinux

Re : Modifier fichier xml en duplicant contenu

Si je peux le faire travailler directement sur le fichier genre avec un -i... ça serait top.

Je ne pense pas que ce soit possible, mais tu peux faire :

awk ...... fichier >fichier_temporaire
mv fichier_temporaire fichier

Personnellement, je préfère toujours vérifier le résultat avant d'écraser le fichier d'origine.

Hors ligne

#13 Le 18/06/2016, à 06:01

pingouinux

Re : Modifier fichier xml en duplicant contenu

@Anthony87 #13 :
Question 1 : Non, loin de là
Question 2 : J'ai beaucoup pratiqué lorsque j'étais en activité

Hors ligne

#14 Le 18/06/2016, à 09:19

L'Africain

Re : Modifier fichier xml en duplicant contenu

En tous cas c'est bluffant un très grand merci je viens de gagner deux jours de travail!


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

Hors ligne

#15 Le 18/06/2016, à 11:37

credenhill

Re : Modifier fichier xml en duplicant contenu

hello

L'Africain a écrit :

Avec awk y a-t-il une option -i comme avec sed?

oui
https://www.gnu.org/software/gawk/manua … place.html

Hors ligne

#16 Le 18/06/2016, à 11:58

pingouinux

Re : Modifier fichier xml en duplicant contenu

@credenhill : Merci pour le tuyau

Hors ligne

#17 Le 18/06/2016, à 13:27

L'Africain

Re : Modifier fichier xml en duplicant contenu

Bonjour,
Je suis désolé c'est encore moi... La commande fonctionne très très bien mais j'ai constaté que mon logiciel ne lit pas correctement le fichier transformé, s'il y a plusieurs références qui se suivent il faudrait transformer le texte de telle sorte que la transformation précède la référence exemple, ligne originale :

<title type="parallel"><reference osisRef="">(Mc 1, 2-6; Lc 3, 1-6; Jn 1, 19-23)</reference></title></p>

Ligne finale:

<title type="parallel"><reference osisRef="Mk.1.2-6">(Mc 1, 2-6; <reference osisRef="Lk.3.1-6">Lc 3, 1-6; <reference osisRef="Jn.1.19-23">Jn 1, 19-23)</reference></title></p>

Je ne voudrais pas abuser de votre générosité, mais si c'est possible ça serait formidable!


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

Hors ligne

#18 Le 19/06/2016, à 09:34

pingouinux

Re : Modifier fichier xml en duplicant contenu

Je ne voudrais pas abuser de votre générosité, mais si c'est possible ça serait formidable!

Je vais attendre la prochaine modif de la demande pour regarder… smile

Questions :

  1. Est-il normal que le premier osisRef= soit à l'extérieur des parenthèses, et les autres à l'intérieur ?

  2. Est-il normal qu'une seule balise <reference...> soit fermée par </reference>

Hors ligne

#19 Le 19/06/2016, à 13:38

L'Africain

Re : Modifier fichier xml en duplicant contenu

Est-il normal que le premier osisRef= soit à l'extérieur des parenthèses, et les autres à l'intérieur ?

Oui ça c'est normal, sinon ça ne fonctionne pas la parenthèse sera mal interprétée.

Est-il normal qu'une seule balise <reference...> soit fermée par </reference>

Bien vu, il me reporte une erreur si je ne ferme pas avec </reference>
Ce qui veut dire qu'il faudrait écrire la ligne comme suit :

<title type="parallel"><reference osisRef="Mk.1.2-6">(Mc 1, 2-6; </reference><reference osisRef="Lk.3.1-6">Lc 3, 1-6; </reference><reference osisRef="Jn.1.19-23">Jn 1, 19-23)</reference></title>

Merci !


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

Hors ligne

#20 Le 19/06/2016, à 13:52

pingouinux

Re : Modifier fichier xml en duplicant contenu

Je suppose que tu as oublié </p> à la fin de la ligne que tu montres en #20.

Du coup j'ai trouvé plus simple de le refaire en python :

$ cat corrig.py
import sys, re
fo=sys.stdout

rec=re.compile('(.*osisRef=")[^"]*(">\()([^)]+)(.*)')

def modiref(ref):
   ref=re.sub(', *','.',ref)
   ref=re.sub(' +','.',ref)
   ref=ref.replace('c','k')
   return ref

for lig in sys.stdin.readlines():
   k=rec.match(lig)
   if k:
      refs=re.split('; *',k.group(3))
      fo.write("%s%s%s%s"%(k.group(1),modiref(refs[0]),k.group(2),refs[0]))
      for ref in refs[1:]: fo.write('; </reference><reference osisRef="%s">%s'%(modiref(ref),ref))
      fo.write('%s\n'%(k.group(4)))
   else: fo.write(lig)

À lancer ainsi :

python corrig.py <fichier

Édité : Simplification du script

Dernière modification par pingouinux (Le 19/06/2016, à 14:10)

Hors ligne

#21 Le 19/06/2016, à 15:13

L'Africain

Re : Modifier fichier xml en duplicant contenu

Impressionnant !!! Ça fonctionne parfaitement, merci beaucoup. Je vais même envoyer ça aux développeurs de sword (logiciel biblique) pour qu'ils puissent en tirer partie...

Je suppose que tu as oublié </p> à la fin de la ligne que tu montres en #20.

Non, j'ai copié une autre ligne par mégarde et il n'y avait pas de </p> j'en ai regardé d'autres et en général il n'y a pas de </p> à la fin.
Merci pingouinux...


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

Hors ligne