Déplacement de chaines caractères

Déplacement de chaines caractères - Divers - Programmation

Marsh Posté le 30-10-2008 à 12:30:48    

Bonjour à tous et à toutes,
 
Je souhaiterais pouvoir déplacer un segment de phrase automatiquement (car j'ai plusieurs milliers de lignes et je ne me vois pas faire tout ça à la main !!)
 
Voici un exemple, j'ai ce schéma :
<record><rank><country><cont><pop (ou autres données)><year>  .. je voudrais arriver à :
<record><rank><country><pop (ou autres données)><cont><year>
 

Citation :

<record><rank>1</rank><country code="cn">Chine</country><cont>Asie</cont><pop>1330044605</pop><year>2008</year></record>
<record><rank>2</rank><country code="in">Inde</country><cont>Asie</cont><pop>1147995898</pop><year>2008</year></record>
<record><rank>3</rank><country code="us">Etats-Unis</country><cont>Am&#233;riques</cont><pop>303824646</pop><year>2008</year></record>
<record><rank>4</rank><country code="id">Indon&#233;sie</country><cont>Asie</cont><pop>237512355</pop><year>2008</year></record>
<record><rank>5</rank><country code="br">Br&#233;sil</country><cont>Am&#233;riques</cont><pop>191908598</pop><year>2008</year></record>
 
... les fichiers ne contiennent pas que des "<pop>"
 
<record><rank>1</rank><country code="">Inde</country><cont>Asie</cont><ssalim>204,4</ssalim><year>2005</year></record>
<record><rank>2</rank><country code="">Chine</country><cont>Asie</cont><ssalim>164,4</ssalim><year>2005</year></record>
<record><rank>3</rank><country code="">Bangladesh</country><cont>Asie</cont><ssalim>44,0</ssalim><year>2005</year></record>
<record><rank>4</rank><country code="">Ethiopie</country><cont>Afrique</cont><ssalim>28,7</ssalim><year>2005</year></record>
<record><rank>5</rank><country code="">Pakistan</country><cont>Asie</cont><ssalim>26,3</ssalim><year>2005</year></record>


 
-> Il faudrait que je puisse glisser les lignes "<cont>" avant les lignes "<year".
 
Merci d'avance

Reply

Marsh Posté le 30-10-2008 à 12:30:48   

Reply

Marsh Posté le 30-10-2008 à 16:08:32    

Personne ne connait une astuce ?
 
J'aurai voulu commencer ce travail bientôt

Reply

Marsh Posté le 30-10-2008 à 16:42:05    

Tu fais ça par exemple en perl:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Tie::File;
  5.  
  6. my $filename = "juanita88.txt";
  7. tie my @data, 'Tie::File', $filename or die "Can't tie file $filename";
  8. foreach (@data) {
  9.    s/^(.*)(\<cont\>[^<]*\<\/cont\> )(.*)(\<year\>[^<]*\<\/year\> )(.*)$/$1$3$2$4$5/o if (/\<cont\>/o);
  10. }
  11. untie @data;

Attention, le forum rajoute un blanc après [^<]*\<\/cont\> et [^<]*\<\/year\> avant la parenthèse fermante, alors qu'il ne doit pas y en avoir.
 
fichier juanita88.txt avant:

Citation :

<record><rank>1</rank><country code="cn">Chine</country><cont>Asie</cont><pop>1330044605</pop><year>2008</year></record>
<record><rank>2</rank><country code="in">Inde</country><cont>Asie</cont><pop>1147995898</pop><year>2008</year></record>
<record><rank>3</rank><country code="us">Etats-Unis</country><cont>Am&#233;riques</cont><pop>303824646</pop><year>2008</year></record>
<record><rank>4</rank><country code="id">Indon&#233;sie</country><cont>Asie</cont><pop>237512355</pop><year>2008</year></record>
<record><rank>5</rank><country code="br">Br&#233;sil</country><cont>Am&#233;riques</cont><pop>191908598</pop><year>2008</year></record>


et après:

Citation :

<record><rank>1</rank><country code="cn">Chine</country><pop>1330044605</pop><cont>Asie</cont><year>2008</year></record>
<record><rank>2</rank><country code="in">Inde</country><pop>1147995898</pop><cont>Asie</cont><year>2008</year></record>
<record><rank>3</rank><country code="us">Etats-Unis</country><pop>303824646</pop><cont>Am&#233;riques</cont><year>2008</year></record>
<record><rank>4</rank><country code="id">Indon&#233;sie</country><pop>237512355</pop><cont>Asie</cont><year>2008</year></record>
<record><rank>5</rank><country code="br">Br&#233;sil</country><pop>191908598</pop><cont>Am&#233;riques</cont><year>2008</year></record>


Noter que ce script modifie le fichier de départ, donc le sauvegarder au cas ou, avant application du script ou adapter le script.
Il aura pour effet de déplacer ce qui est entre la balise cont juste avant la balise year.
A+,


Message édité par gilou le 30-10-2008 à 17:14:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-10-2008 à 16:51:16    

C'est quoi l'intérêt [:petrus dei]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2008 à 17:07:08    

Je me le suis aussi demandé, vu que dans ce fichier xml, les balises en question etant de même rang, leur ordre ne devrait pas avoir d'importance, sauf s'il y a un schema associé utilisé pour faire une validation.
A+,

Message cité 1 fois
Message édité par gilou le 30-10-2008 à 17:11:35

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-10-2008 à 17:15:09    

gilou a écrit :

sauf s'il y a un scheme associé utilisé pour faire une validation.
A+,


Et encore, même en XSD il est possible de créer des groupes sans ordre [:pingouino] (c'est plus facile en RNG par contre)

 

edit: et accessoirement, je ferais ce genre de manips avec une lib XML dans [langage de prog préféré], genre ElementTree en Python, perso.

Message cité 1 fois
Message édité par masklinn le 30-10-2008 à 17:15:49

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2008 à 17:34:09    

masklinn a écrit :

edit: et accessoirement, je ferais ce genre de manips avec une lib XML dans [langage de prog préféré], genre ElementTree en Python, perso.

Pour du XML de profondeur 1, avec une ligne = un record, c'est souvent plus couteux en perfs.
Par contre, des qu'on a besoin d'un peu de contexte, ou bien quand on a des records multi lignes, c'est plus efficace et sur, de parser en un arbre.
Je pourrais employer XML::Simple::Tree en perl par exemple.
 
En SGML, les groupes sans ordres étaient une des constructions de base, au même titre que les groupes ordonnés, les repetitions et les choix. Ca a sauté en XML pour une raison simple: écrire un parser qui détecte les ambiguités dans un schéma devenait beaucoup plus compliqué. Mais Relax etant inventé par J Clark, qui a écrit aussi un des meilleurs parsers SGML, il a conservé avec raison cette possibilité dans le langage.
A+,

Message cité 1 fois
Message édité par gilou le 30-10-2008 à 17:40:12

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-10-2008 à 17:56:59    

gilou a écrit :

Pour du XML de profondeur 1, avec une ligne = un record, c'est souvent plus couteux en perfs.


Ouais enfin là ça m'a l'air d'être un one-shot, puisqu'il parle de le faire à la main, et sur quelques milliers de lignes je doute que le coût soit bien terrifiant (j'ai joué à parser, filtrer et réordonner des dump XML de log SVN, 38Mo de XML ça coûte mais 1 ou 2Mo pas vraiment, et je fais mes manips avec cElementTree)

gilou a écrit :

Je pourrais employer XML::Simple::Tree en perl par exemple.


Ou lxml, il y a des bindings de partout (y compris Python) et ça marche pas mal d'habitudes.

gilou a écrit :

En SGML, les groupes sans ordres étaient une des constructions de base, au même titre que les groupes ordonnés, les repetitions et les choix.


:jap: (les répétitions et les choix sont des constructions de base en XSD, mais j'ai vérifié et en fait les groupes non ordonnés sont quasi impossibles à exprimer, je me souvenais plus de ça [:pingouino])


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2008 à 18:28:57    

Ok mais excusez moi, je suis une grande débutante en programmation (d'ou le xml), c'est quoi PERL ?
 
Pour répondre à vos questions, mes fichiers xml sont destinés à activewidgets (http://www.activewidgets.com/general.demos/), donc je pense que l'ordre des colonnes est prise en compte

Reply

Marsh Posté le 30-10-2008 à 18:31:01    

Citation :

c'est quoi PERL ?

C'est quoi google?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-10-2008 à 18:31:01   

Reply

Marsh Posté le 30-10-2008 à 22:53:51    

Voilà je me suis renseigné sur PERL, un peu compliqué tout ça.. je n'ai ni en ligne, ni en local reussie à faire fonctionner ce script...
 
N'existe-il pas un petit logiciel qui me permetterait de le faire ?

Reply

Marsh Posté le 30-10-2008 à 23:03:53    

ben oui, perl


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 31-10-2008 à 14:11:06    

C'est y est !! C'est rigolo mais pourquoi s'embêter avec PERl alors qu'il suffit d'ouvrir mon xml sous excel et hop, un petit glisser de mes colonnes !!!
Merci !

Reply

Marsh Posté le 31-10-2008 à 14:23:55    

amis programmateurs bonjour.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed