|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
Bonjour,
Je cherche à mettre en place un algorithme pour tenter de résoudre le cas suivant : Fichier en entrée composé de la séquence ci-dessous Code :
Tout pavé commençant par A et se terminant par Z doit aller dans une fichier "liste" Tout pavé commençant par A et ne se terminant pas par Z doit aller dans une fichier "poubelle" Tout pavé ne commençant pas par A et qui se termine par Z doit aller dans une fichier "poubelle" Exemple Fichier en entrée Code :
1- fichier liste qui contiendra les pavés 1 & 2 2- fichier poubelle qui contiendra les pavés 3 & 4 Toute la difficulté ( de mon point de vue) réside dans la séquence de rupture d'un pavé. Si vous avez une idée, ça serait avec plaisir Bon après-midi |
||||
|
|
10
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 534 ![]() |
pour multiplier les manipulation sed devrait être efficace.
/du_mot/,/au_mot/commande permettra la sélection par paragraphe \i pour l'insertion de -- Pavé X et jouer la redirection vers le fichier résultat. |
|
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() |
@frp31 : je ne pense pas que cela résolve son problème (ou en tout cas, pas aussi simplement que tu le laisses entendre
@emmachane : tu dois pouvoir t'en sortir avec awk, mais pour ce genre de traitement, j'utiliserais perl que je connais mieux. Une version un peu "rapide" serait par exemple ci-dessous. Edit : si ton problème, c'est l'algo, voici une version basique qui peut marcher 1) lecture d'une ligne 1.1) si c'est un début de pavé (commence par "-- Pav..."), est-ce que la ligne précédente commençait par Z ? 1.1.1) si oui, j'affiche le buffer 1.1.2) j'enregistre la ligne dans le buffer (en écrasant son contenu) 1.2) sinon (ce n'est pas le début d'un pavé) 1.2.1) si je détecte une erreur (par exemple : la ligne précédente était un début de pavé et la ligne courante ne commence pas par A), je vide le buffer 1.2.2) si le buffer est déjà vide, je ne le remplis pas 1.2.2) si il n'y a pas d'erreur (cf. 1.2.1) ou si on est en train de capturer un pavé (buffer non vide), je concatène la ligne courante avec le buffer 2) je mémorise la ligne lue pour pouvoir la comparer La traduction rapide en perl : Code :
|
||
|
|
01
|
|
|
#4 | |||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Citation:
Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|||
|
|
20
|
|
|
#5 | |||
|
Membre Expert
![]() |
Citation:
(j'avoue, je connais très mal sed... )Edit: et si le fichier contient des séparateurs de blocs, ça marche toujours ? Parce que je comprends de ce que tu fais que tu chopes toutes les lignes comprises entre une ligne commençant par A et une commençant par Z. Mais moi, je comprends de son exemple que les pavés sont également délimités par un repère (les lignes avec --Pavé...), et que si ta ligne commençant par A fait partie du pavé 3 et celle finissant par Z est dans le pavé 4 (ou si la ligne commençant par A n'est pas la première du pavé 3), il ne faut rien afficher :o C'est pour ça que je me suis un peu fait ch... en perl |
|||
|
|
10
|
|
|
#6 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Re-
Citation:
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
10
|
|
|
#7 | ||
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
Merci pour vos réponses, je vais les tester. Je souhaite apporter une précision sur le fichier en entrée. Il est identique à :
Code :
|
||
|
|
10
|
|
|
#8 | |||||
|
Membre Expert
![]() |
Citation:
![]() Autant pour moi, je me suis compliqué la vie Edit (j'ai ajouté un ou deux pièges quand même) : Code :
|
|||||
|
|
01
|
|
|
#9 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Les explications pour "sed" :
Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
20
|
|
|
#10 | ||||||
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
@Alek-C
Ton code fonctionne très bien pour la génération du fichier liste Code :
Code :
Code :
Pardon, mais je n'y connais rien en langage Perl. Merci |
||||||
|
|
01
|
|
|
#11 | ||
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
@zipe31
J'ai testé ton code qui fonctionne très bien dans le cas cité dans le premier message Code :
En fait, ce dernier est redirigé vers le fichier "poubelle" alors qu'il devrait être dans le fichier "liste". Navré de vous demander à tous les deux une solution toute faite mais c'est tellement proche du but. Merci encore |
||
|
|
01
|
|
|
#12 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Re-
Essaie avec ça (les changements dans "fich.sed" sont en gras et rouge) : Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
10
|
|
|
#13 | ||
|
Membre Expert
![]() |
Effectivement, dans mes exemples, j'ai oublié le fichier poubelle.
Mais il faudrait avoir toutes les règles de gestion d'un seul coup si on veut avoir une solution définitive 1) est ce que 2 lignes A peuvent se suivre ? 2) est ce que 2 lignes Z peuvent se suivre ? 3) est ce qu'un pavé commence par le premier A ou le second si plusieurs se suivent (idem pour la fin du pavé) 4) est ce qu'un pavé peut contenir une ligne commençant par A ou Z (je crois que non) ? Si on dit qu'un pavé commence par une ligne A et se termine par une ligne Z en n'ayant aucune ligne A ou Z entre les 2, cet algo devrait marcher : 1) lecture ligne 1.1) si ligne commence par A, alors on met le buffer dans poubelle (si non vide) et on écrase le contenu du buffer avec la ligne 1.2) sinon si ligne commence par Z, alors on ajoute la ligne au buffer 1.2.2) si buffer commence par A (ce qui veut dire qu'on a au moins une ligne qui commence par A et une qui commence par Z), on le met dans liste 1.2.2) sinon, on le met dans poubelle 1.2.3) on vide le buffer dans tous les cas puisqu'il a été affiché 1.3) sinon (ligne ne commence ni par A ni par Z), on ajoute la ligne au buffer c'est plus simple que mon premier algo car il n'y a pas les "pavés" à gérer en perl, ça donne ça (j'ai utilisé la sortie d'erreur pour le fichier poubelle et la sortie standard pour liste, d'où la redirection de chaque sortie dans les fichiers correspondants) : Code :
|
||
|
|
10
|
|
|
#14 | |||||
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 534 ![]() |
Citation:
après le bloc sed utilisé pour le fichier liste il faut ajouter pour créer le séparateur /^A/ i --------- ou un post traitement Code :
|
|||||
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
@Alek-C
1) est ce que 2 lignes A peuvent se suivre => Oui 2) est ce que 2 lignes Z peuvent se suivre => Oui 3) est ce qu'un pavé commence par le premier A ou le second si plusieurs se suivent (idem pour la fin du pavé) => Non 4) est ce qu'un pavé peut contenir une ligne commençant par A ou Z (je crois que non) ? Non |
|
|
10
|
|
|
#16 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Citation:
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
01
|
|
|
#17 | |||
|
Membre Expert
![]() |
Citation:
Code :
|
|||
|
|
11
|
|
|
#18 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Explications concernant le rajout au script "sed" :
Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
10
|
|
|
#19 |
|
Membre du Club
![]() Inscription : août 2009 Messages : 65 ![]() |
On avance bien Alek-C
Le programme perl ne résout malheureusement pas le cas : Tout pavé encadré par : - une ligne de début qui démarre avec un A - une ligne de fin qui ne démarre pas par un Z Ce cas correspond à ce que j'ai mentionné dans mon premier message, à savoir : Tout pavé commençant par A et ne se terminant pas par Z doit aller dans une fichier "poubelle" @zipe31 Quand je lande le programme fich.sed, le terminal me renvoie le message : "sed : /.*\nZ/! bz dans une commande reconnue" nb : je suis sous Solaris et le sed n'est pas forcément à jour. |
|
|
01
|
|
|
#20 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Citation:
![]() Euh... et hier ça marchait ? C'est bizarre ça C'est le message d'erreur original ?
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
01
|
Copyright © 2000-2012 - www.developpez.com