|
|
|
|
||||||
| fr.comp.os.unix Système UNIX. |
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour,
Je dois réaliser un script qui découpe un fichier selon des chaînes de caractères de début et de fin. Plus clairement, un exemple : <?xml ..... ..... <A0="18"/> <A1="19"/> <A2="20"/> .... </toto> <?xml ..... ..... <A0="35"/> <A1="21"/> <A2="5"/> .... </toto> .... Et pour simplifier, le nom de chaque fichier serait par exmple : nom_18_19_20 et nom_35_21_5 Merci de votre aide Laurent |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Laurent :
> Je dois réaliser un script Quel "langage de script"? Tout bon langage interprété qui se respecte dispose d'un parser XML: - http://caml.inria.fr/cgi-bin/hump.en...rt=0&browse=49 - http://www.python.org/doc/current/li...ers.expat.html - [perl] - [ruby] - ... -- Debian/apt Repo: http://locataire-serveur.info/sectio...ian-repository Fedora/yum Repo: http://locataire-serveur.info/sectio...edora-core-yum |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On 23 Feb 2006 02:22:38 -0800, Laurent wrote:
> Bonjour, > > Je dois réaliser un script qui découpe un fichier selon des chaînes > de caractères de début et de fin. > > Plus clairement, un exemple : > > <?xml ..... > .... > <A0="18"/> > <A1="19"/> > <A2="20"/> > ... > </toto> > <?xml ..... > .... > <A0="35"/> > <A1="21"/> > <A2="5"/> > ... > </toto> > ... > > Et pour simplifier, le nom de chaque fichier serait par exmple : > nom_18_19_20 et nom_35_21_5 [...] awk ' !inside && /^<\?xml/ { inside = 1 content = "" split("XX_XX_XX", a, "_") } !inside {next} {content = content $0 "\n"} match($0, /^<A[0-2]="[0-9]+"/) { i = substr($0, RSTART+2, 1) n = substr($0, RSTART+5, RLENGTH-6) a[i] = n next } /^<\/toto>/ { file = "mon_" a[0] "_" a[1] "_" a[2] printf "%s", content > file close(file) content = "" inside = 0 }' Ce n'est pas garanti de marcher si les fichiers resultat peuvent faire plus de 2ko (ca marchera avec GNU awk, toutefois). -- Stephane |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
Laurent wrote:
> Bonjour, > > Je dois réaliser un script qui découpe un fichier selon des chaînes > de caractères de début et de fin. Emploie un langage de script qui intègre bien les expressions régilières, Ruby Perl Python ou encore Awk. > > Plus clairement, un exemple : > > <?xml ..... > .... > <A0="18"/> > <A1="19"/> > <A2="20"/> > ... > </toto> > <?xml ..... > .... > <A0="35"/> > <A1="21"/> > <A2="5"/> > ... > </toto> > ... > > Et pour simplifier, le nom de chaque fichier serait par exmple : > nom_18_19_20 et nom_35_21_5 franchement, je ne touve pas cela plus clair, quelles sont les chaînes de caractères de début et de fin ? |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
R12y wrote in message
<pan.2006.02.23.10.58.26.819360@etu.univ-orleans.fr>: > Tout bon langage interprété qui se respecte dispose d'un parser XML: Il faut faire attention: beaucoup de parseurs XML perdent certains aspects de l'information, qui sont non-pertinents en XML mais peuvent être tout à fait importants dans certains cas (comme le fait d'écrire ( à la place de @ dans une adresse mail pour mettre en échec à peu de frais les robots collecteurs les plus débiles). |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
Merci pour vos réponses !
Pour Harpo, la chaîne de caractère de début est "<?xml" et celle de fin est "</toto>" En fait, Stéphane, les exemples A0, A1, A2 sont en fait les chaînes de caractères : MAT_COLLAB VALUE MAT_RC VALUE DAP VALUE Comment est-ce que ça modifie ton script shell ? Encore merci Laurent |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
On 23 Feb 2006 11:04:08 -0800, Laurent wrote:
> Merci pour vos réponses ! > > Pour Harpo, la chaîne de caractère de début est "<?xml" et celle de > fin est "</toto>" > > En fait, Stéphane, les exemples A0, A1, A2 sont en fait les chaînes > de caractères : > MAT_COLLAB VALUE > MAT_RC VALUE > DAP VALUE > Comment est-ce que ça modifie ton script shell ? [...] Quelquechose comme: awk -F '[[:blank:]]*=[[:blank:]]*' ' BEGIN { idx["<MAT_COLLAB VALUE"] = 1 idx["<MAT_RC VALUE"] = 2 idx["<DAP VALUE"] = 3 } !inside && /^<\?xml/ { inside = 1 content = "" split("_XX_XX_XX", a, "_") } !inside {next} {content = content $0 "\n"} (n = idx[$1]) && match($2, /^"[0-9]+"/) { a[n] = substr($2, 2, RLENGTH-2) next } /^<\/toto>/ { file = "mon_" a[1] "_" a[2] "_" a[3] printf "%s", content > file close(file) content = "" inside = 0 }' (pas testé mais tu as l'idee) -- Stephane |
|
![]() |
| Outils de la discussion | |
|
|