Vous n'êtes pas identifié.
Bonjour,
Voici mon problème :
J'ai un fichier texte avec des lignes comme ca
A 1 begin A 1 do A 1 end A 2 begin A 2 do A 2 end ...
Evidememment il n'y a pas que A 1 et A 2 mais cela va jusqu'à A n.
Les règles sont les suivantes
- chaque A i doit avoir une occurrence begin, une do et une end
- pour un i fixé le begin doit venir avant le do qui doit lui même venir avant le end
Sinon, l'ordre n'est pas important : on peut avoir cela
A 1 begin A 2 begin A 2 do A 1 do A 1 end A 2 end ...
J'aimerai faire un script pour controller la validité d'un tel fichier.
QQn a t'il une idée ?
Dernière modification par tguillod (24 Mar 2009 17:42:31)
Hors ligne
Pour ça, je préconiserait awk plutôt que shell.
Si j'ai bien compris, tu doit vérifier dans ton premier fichier, si pour Ai il y a toujours un BEGIN, un do et un END?
Hors ligne
Avec AWK j'arrive à chercher des occurences, les compter.
Mais je sais pas comment garantir que begin est avant le do.
Mais idée était de stocker les numéros de lignes puis de les comparer mais c'est pas très élégant.
Dernière modification par tguillod (24 Mar 2009 19:38:32)
Hors ligne
Salut,
Un script python pourrait-il faire l'affaire?
reference=file('test.txt','r+').readlines() tableDeTravail=file('test.txt','r+').readlines() for line in reference: if line.find('begin')>0: # test si elle contient un begin key=line.replace('begin','') lineIndex=tableDeTravail.index(line) test1=(key+'do' in tableDeTravail[lineIndex:len(tableDeTravail)]) if test1: doIndex=tableDeTravail.index(key+'do') test2=(key+'end' in tableDeTravail[doIndex,len(tableDeTravail)]) if test2: tableDeTravail.pop(lineIndex) # enleve la ligne begin tableDeTravail.pop(doIndex) # enleve la ligne do tableDeTravail.remove(key+'end') # enleve la ligne end return tableDeTravail # devrait être vide
Meilleures salutations.
Hors ligne
Hello,
tu peux trier le fichier avec
grep 'A (\d+) (begin|do|end)' | sort -k2 -n
Et vérifier que les lignes begin-do-end alternent correctement, avec sed ou awk.
Sinon, ma version en perl:
#!/usr/bin/perl -n /A\s+(\d+)\s+(begin|do|end)/ or next; ($old, $s{$1}) = ($s{$1},$2); next if $2 eq 'begin' && !defined $old; next if $2 eq 'do' && $old eq 'begin'; next if $2 eq 'end' && $old eq 'do'; die "Error at file $ARGV, line $.: got '$2' for $1, was '$old'.\n"; END { print STDERR "Error at eof $ARGV, $_ at $s{$_}\n" for (grep !/end/, keys %s); }
Hors ligne
Ok,merci beaucoup
J'ai pu m'en sortir à l'aide de ton script perl.
Pour le python, je connais juste assez pour comprendre mais pas assez pour étendre le script.
J'aimerai bien apprendre.
Avec quel livre / pdf avez cous appris le python ?
Hors ligne
Salut,
Est-ce que c'est possible de se tutoyer?
Ce PDF devrait t'apprendre quelques petits trucs : http://www.framasoft.net/IMG/pdf/python_notes-2.pdf
Meilleures salutations.
Hors ligne
Si tu sais déjà programmer : http://diveintopython.org/ (un peu vieux, mais peu de choses ont changés).
Hors ligne