OVH Cloud OVH Cloud

Cration d'un script de découpe d'un fichier par chaîne de carcatère

6 réponses
Avatar
Laurent
Bonjour,

Je dois r=E9aliser un script qui d=E9coupe un fichier selon des cha=EEnes
de caract=E8res de d=E9but et de fin.

Plus clairement, un exemple :

<?xml .....
.=2E..
<A0=3D"18"/>
<A1=3D"19"/>
<A2=3D"20"/>
.=2E.
</toto>
<?xml .....
.=2E..
<A0=3D"35"/>
<A1=3D"21"/>
<A2=3D"5"/>
.=2E.
</toto>
.=2E.

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

6 réponses

Avatar
R12y
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.cgi?sort=0&browseI
- http://www.python.org/doc/current/lib/module-xml.parsers.expat.html
- [perl]
- [ruby]
- ...

--
Debian/apt Repo: http://locataire-serveur.info/sections/liens/debian-repository
Fedora/yum Repo: http://locataire-serveur.info/sections/liens/fedora-core-yum

Avatar
Stephane Chazelas
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

Avatar
Harpo
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 ?

Avatar
Nicolas George
R12y wrote in message
:
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 &#40; à la place
de @ dans une adresse mail pour mettre en échec à peu de frais les robots
collecteurs les plus débiles).

Avatar
Laurent
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
Avatar
Stephane Chazelas
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