Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/12/2014, à 18:22

L'Africain

Script perl pour mettre verset à la ligne

Bonjour,
Dans la continuité de cette discussion, j'ai ça :

Tobit # (nom du livre)
1 # (indique le chapitre, est suivi d'un retour à la ligne)
1  Histoire de Tobit, fils de Tobiel, ...
2  Aux jours de Salmanasar, ...
3  Moi, Tobit... 4  Dans ma jeunesse....
...
64...
2 # Indique un nouveau chapitre
1 ...
2...

Je dois obtenir ça:

$$$nom _du_livre 1,(numéro de chapitre)1(numéro de verset)
Histoire de Tobit, fils de Tobiel, ...
$$$nom _du_livre 1,2
Aux jours de Salmanasar, ..

j'ai testé le script proposé par ajet:

En supposant que la ligne de no de chapitre ne comprenne que ce no - eventuellement suivit d'espaces, je propose ce pseudo code perl - pas teste, peut etre des erreurs de syntaxe a corriger

# Par la suite, je suppose que le titre est dans la variable $book_title
while ($line = <FICLOC>)
# Detection de chapitre
  if ($line =~ '/^(\d+)\s*$/') {
     $n_chapter = $1;
  }

## Detection de versets
  if ($line =~ '/^(\d+)\s+(.+)$/') {
    $n_verse = $1;
    $text_verse = $2;
    $formatted_text = "\$\$\$$book_title $n_chapter,$n_verse\n$text_verse";
   # Ecriture de cette ligne dans le fichier texte
    print FICOUT "$formatted_text\n";
  }
}

voici les résultats d'erreur du terminal:

./script_ajet Judith.txt 
syntax error at ./script_ajet line 5, near ")
# Detection de chapitre
  if"
syntax error at ./script_ajet line 16, near "}"
Unmatched right curly bracket at ./script_ajet line 17, at end of line
Execution of ./script_ajet aborted due to compilation errors.

Merci déjà à Ajet!
PS: J'ai déjà un version faite à la manuellement, mais j'en ai encore trois à travailler...

Dernière modification par L'Africain (Le 05/12/2014, à 18:29)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#2 Le 05/12/2014, à 21:25

αjet

Re : Script perl pour mettre verset à la ligne

L'erreur vient de l'accolade manquante dans la boucle while - corrige ci dessous.

Note que ce bout de script ne fonctionnera pas tout seul. Je l'avais ecrit en pensant que tu l'insererait dans ton script initial.
* Il faut que tu inseres la partie qui se charge de d'ouvrir les fichiers.
* comme indique dans le premier commentaire il faut aussi recupere le titre du livre.

# Par la suite, je suppose que le titre est dans la variable $book_title
while ($line = <FICLOC>){
# Detection de chapitre
  if ($line =~ '/^(\d+)\s*$/') {
     $n_chapter = $1;
  }

## Detection de versets
  if ($line =~ '/^(\d+)\s+(.+)$/') {
    $n_verse = $1;
    $text_verse = $2;
    $formatted_text = "\$\$\$$book_title $n_chapter,$n_verse\n$text_verse";
   # Ecriture de cette ligne dans le fichier texte
    print FICOUT "$formatted_text\n";
  }
}

αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#3 Le 24/12/2014, à 11:20

L'Africain

Re : Script perl pour mettre verset à la ligne

Désolé j'avais pas vu la réponse je vais voir ça!! Merci!!

Edit : J'avais pas lu en entier donc j'avais pas vu:

ajet à écrit:
* Il faut que tu inseres la partie qui se charge de d'ouvrir les fichiers.
* comme indique dans le premier commentaire il faut aussi recupere le titre du livre.

Or je sais pas faire ça!!! Disons que le fichier .txt a traiter porte le nom du livre comme : tobit.txt par exemple.

Dernière modification par L'Africain (Le 24/12/2014, à 11:41)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#4 Le 31/12/2014, à 12:53

L'Africain

Re : Script perl pour mettre verset à la ligne

Bonjour,
J'ai essayé ça, mais ça marche pas j'arrive pas a faire la boucle correctement, surtout que je voudrais faire un script qui travaille sur tous les fichiers, la j'ai essayé avec un fichier "tobie", j'avoue que je comprend pas grand chose à ce que j'ai essayé moi-même, je voudrais y mettre une variable "*.txt":

#!/usr/bin/perl
#ouverture du fichier à modifier
print "tobie.txt";
$tobie=<STDIN>;

chomp $tobie;
open(tobie)||die "$!";

#ouverture du fichier modifié
open(formatted_txt);

# Par la suite, je suppose que le titre est dans la variable $book_title
while ($line = <FICLOC>){
# Detection de chapitre
  if ($line =~ '/^(\d+)\s*$/') {
     $n_chapter = $1;
  }

## Detection de versets
  if ($line =~ '/^(\d+)\s+(.+)$/') {
    $n_verse = $1;
    $text_verse = $2;
    $formatted_text = "\$\$\$Tobie$n_chapter:$n_verse\n$text_verse";
   # Ecriture de cette ligne dans le fichier texte
    print FICOUT "$formatted_text\n";
  }
}
#fermeture
close(formatted_txt);
close(tobie.txt);

Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#5 Le 31/12/2014, à 13:19

αjet

Re : Script perl pour mettre verset à la ligne

Pour ce qui est de l'ouverture du fichier, tu aurais pu t'inspire du script que tu avais poste dans la premiere discussion. Cela suppose que tu passe le nom de fichier en argument quand tu execute ton script.

Ouverture du fichier:

#!/usr/bin/perl
$entree = $ARGV[0];
open(FICLOC, $entree);

Recuperation du titre, en prenant pour hypothese que le nom du ficher est le titre du livre. Le code ci dessous fait les operations suivantes:
* Test si le nom de fichier a une extension (par exemple .txt),
* si oui il prend le nom de fichier sans l'extension,
* sinon, il prend l'integralite du nom de fichier.

if ( $entree =~ /(.*)\.[^\.]+/ ) {
        $book_title = $1;
} else {
       $book_title = $entree;
}

Ouverture du fichier de sortie

$ext = ".EXT"; #Insere ici l'extension que tu souhaites pour ton fichier
open(FICOUT, ">", "$book_title.$ext");

Note: je ne suis pas tres familier avec perl, il est possible que ce language ait des fonctions deja prevue pour manipuler des arborscences et noms de fichiers.


Quelques observations sur ton code:
* Ce n'est pas une bonne idee de nommer une variable en utilisant un nom particulier (ex, tobie). Ta variable doit representer le type d'objet/information qu'elle represente. Par ex, livre/book chapitre/chapter, verset/verse. Personnellement je prefere les nommer en anglais car ton code pourra etre relu par des non-francophones.
* L'instuction close(formatted_txt); ne sert a rien et produira un erreur: c'est une variable de type string, ce n'est pas un descripteur de fichier. Il n'y a pas lieu de la fermer. D''ailleurs, il semble que la syntaxe exacte soit:

close FILEHANDLE

soit dans ton cas :

close FICLOC;
# et
close FICOUT;

Source: http://perldoc.perl.org/functions/close.html

Dernière modification par αjet (Le 31/12/2014, à 13:28)


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#6 Le 01/01/2015, à 16:43

L'Africain

Re : Script perl pour mettre verset à la ligne

Salut,
Voilà donc le fichier final:

#!/usr/bin/perl

#ouverture du fichier à modifier
$entree = $ARGV[0];
open(FICLOC, $entree);

if ( $entree =~ /(.*)\.[^\.]+/ ) {
        $book_title = $1;
} else {
       $book_title = $entree;
}

#ouverture du fichier modifié
$ext = ".txt"; #Insere ici l'extension que tu souhaites pour ton fichier
open(FICOUT, ">", "$book_title.$ext");

# Par la suite, je suppose que le titre est dans la variable $book_title
while ($line = <FICLOC>){
# Detection de chapitre
  if ($line =~ '/^(\d+)\s*$/') {
     $n_chapter = $1;
  }

## Detection de versets
  if ($line =~ '/^(\d+)\s+(.+)$/') {
    $n_verse = $1;
    $text_verse = $2;
    $formatted_text = "\$\$\$book_title$n_chapter:$n_verse\n$text_verse";
   # Ecriture de cette ligne dans le fichier texte
    print FICOUT "$formatted_text\n";
  }
}

Mais ça marche pas!
J'ai appelé le script ./traitement_bible.pl, puis j'ouvre un terminal à l'endroit des fichiers a traiter en faisant ça:

./traitement_bible.pl 

Mais rien :
J'ai le retour terminal habituel:

@W54:/home/.../Modules_bibles/***/deutéro$

Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#7 Le 01/01/2015, à 21:26

αjet

Re : Script perl pour mettre verset à la ligne

Est-ce que tu passe bien un fichier en argument?

./traitement_bible.pl fichier_a_traiter

Dernière modification par αjet (Le 01/01/2015, à 21:27)


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#8 Le 02/01/2015, à 10:46

L'Africain

Re : Script perl pour mettre verset à la ligne

Bonjour et bonne année,
En fait j'ai essayé les deux, mais comme je croyais que le script travaillait sur tout les fichier .txt du dossier, j'ai pas mis de fichier texte en argument, si je le fait, exemple ici avec le fichier Baruch.tx, en sortie, j'ai un fichier texte vide, Baruch..txt, avec deux points avant l'extension.
Merci pour ton aide!


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#9 Le 02/01/2015, à 12:02

αjet

Re : Script perl pour mettre verset à la ligne

L'Africain a écrit :

Bonjour et bonne année,

Merci, Bonne annee egalement.

L'Africain a écrit :

je croyais que le script travaillait sur tout les fichier .txt du dossier,

Non, comme je l'avais mentionne, j'ai repris ton script initial qui prend un fichier comme argument.


L'Africain a écrit :

Baruch..txt, avec deux points avant l'extension.

Cette erreur est facile a diagnostiquer: la variable $ext contient le text ".txt", donc dans la commande ci-dessous, $book_title.$ext va generer deux points. peux supprimer le point dans la variable ou dans la ligne open

open(FICOUT, ">", "$book_title.$ext");
L'Africain a écrit :

en sortie, j'ai un fichier texte vide,

Il faut que tu diagnostique la/les erreurs dans le script. Pour debugger, je te conseille d'imprimer le contenu des variable a l'ecran, pour identifier les sections du script qui ne fonctionnent pas comme escompte.

Voici ce que je rajouterais:

Pour verifier si le texte d'entree est correctement lu:

while ($line = <FICLOC>){
print "ligne $line\n";
# Detection de chapitre

Verification de la regex du no de chapitre

  if ($line =~ '/^(\d+)\s*$/') {
     $n_chapter = $1;
     print "No de chapitre : $n_chapter\n"
  }

Fait de meme dans le second bloc if pour tester les valeurs de $n_verse, $text_verse et $formatted_text. Cela te permettra de modifier les portions de code qui ne fonctionnent pas. Etant donne que l'execution du script ne retourne aucune erreur, il est fort probable que les regex ne fonctionnent pas avec ton texte. Si c'est le cas, essaie de les debugger sur un site de test de regex. Par exemple: http://www.gethifi.com/tools/regex ou http://www.regexe.com/.

Bonne continuation.


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne