IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Couper un fichier html en plusieurs fichiers


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut Couper un fichier html en plusieurs fichiers
    Bonjour à tous, j'ai un petit problème que j'arrive pas à résoudre.
    imaginons que j'ai un gros fichier html et je veux le couper non pas toutes les X lignes mais après la ligne où y'aurait le tag suivit d'un bloc html avec des balises et du textes jusqu'à avoir à nouveau un .

    En peut-être un peu plus clair un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <span class="niv2"> #debut du fichier 1
    bblbalbalab
    balbalablaba
    blabalbalab
    blabalablab
    ....
    ....
    bllblabalb  #fin du fichier 1
    <span class="niv2"> #debut du fichier 2
    bblbalbalab
    balbalablaba
    blabalbalab
    blabalablab
    ....
    ....
    bllblabalb  #fin du fichier 2
    <span class="niv2"> #debut du fichier 3
    bblbalbalab
    balbalablaba
    blabalbalab
    blabalablab
    ....
    ....
    bllblabalb  #fin du fichier 3
    <span class="niv2"> #debut du fichier 4
    bblbalbalab
    balbalablaba
    blabalbalab
    blabalablab
    ....
    ....
    bllblabalb  #fin du fichier 4
    Et là j'avoue que je suis un peu complètement bloqué. Au départ j'avais commencé en pensant le faire pas tags mais je coince. Et ligne par ligne je suis autant paumé. Serait-il possible que vous me guidiez un peu?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    ton fichier de depart est il assez petit pour tenir en memoire dans tous les cas?
    Ton tag se trouve t il toujours seul sur sa ligne?
    Ton tag se present il toujours de cette facon (pas d'autres attibuts que class, toujorus des doubles quotes, etc...)

    Si tu peux repondre oui à la troisieme question et à la premiere ou la seconde, alors la chose sera aisée avec une regepx, sinon il te faudra avoir ecours à un parseur HTML comme HTML:arser
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Oui je pense qu'on peut le faire avec une regexp mais en fait ce que je vois pas c'est comment copier le bloc entre les tags.
    En gros ce qui me trouble (et je pense que je pense mal) c'est comment faire pour dire :
    Si tu vois tag toto copie tout dans le fichier X jusqu'au tag toto suivant.

    C'est plus clair?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    mettons que tu puisse faire tenir ton fichier en memoire, et que le tag soit toujours aussi simple, ca pourrait donner ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    # $html contient ton fichier
    my @morceaux = split(/<span class="niv2">/, $html);
    # et ensuite il ne te reste plus qu'à parcourire @morceaux et à ecrire tes fichiers
    une autre possibilité serait d'assigner '<span class="niv2">' à $/, mais autant utiliser le split si le fichier n'est pas trop gros
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    J'ai peur que ça soit un peu trop gros, quelle est la longueur max?
    Où puis-je trouver des renseignements sur la variable $/ ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    find(\&gener_tocX, "$rep_memento/toc.html");
     
    sub gener_tocX
    	{
        open my $old_file,'<', $File::Find::name or die "Can't read $File::Find::name : $!\n";
        my @fichiers =  split(/<span class="niv2">/,$old_file);
        my $i= 1; 
        while ($fichiers[$i]) {
            open my $new_file,"> toc_$i.html" or die "Can't open toc_$i.html: $!\n";
            print {$new_file} $fichiers[$i];
            $i++;
    	    close $new_file;
    	}
        close $old_file;
     
    }
    Voilà ce que j'ai fais mais ça ne me crée pas les fichiers. Surement un truc que j'écris mal. Merci de votre aide.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    $old_file est un FH, un descripteur de fichier sur lequel tu peux lire ou ecrire, mais ca n'est pas le contenu lui meme. Si tu veux faire un split il faut extraire le contenu de ce fh

    exemple de methode, apres ton open:

    my $content = {local $/; <$old_file>};

    (pas besoin de balise code pour une ligne, svp messieurs les moderateurs...)
    et tu peux directement fermer $old_file apres ca, et faire ton split sur $content, et le reste de ton code devrait marcher !

    tant que ton fichier d'origine ne depasse pas 50Mo je ne pense pas que tu ai beaucoup de soucis à te faire
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Ok merci, juste pour ma compréhension personnelle qu'elle est la signification de cette variable $/ ?

    Je viens de tester et ça marche toujours pas je dois faire une erreur.
    my $content = {local $/; <$old_file>}; quand je mets un ";" ça me sort une erreur sur le point virgule. Si je met une virgule, pas d'erreur mais ça marche toujours pas. il n'y a pas de fichiers qui se créent.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    oups excuse j'ai oublié le do: c'est "do{local...}"

    le $/ c'est la variable qui indique à perl le separateur quand il lit le fichier avec <> (par exemple avec un while). Par defaut il est reglé sur \n (ligne par ligne) et ici ou le met à undef, et du coup il lit le fichier en entier. On utilise local et un do{} pour restrindre cette modif à cette seule portion de code.
    Un possibilité pour eviter le split aurait été de donner à $/ la valeur du motif qui sert justement à faire ce split, mais autant rester simple
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Ça marche super bien, merci bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] fusion plusieurs fichiers html
    Par arnest dans le forum Excel
    Réponses: 2
    Dernier message: 25/10/2009, 12h50
  2. [HTML] Ajouter même ligne html par macro (plusieur fichiers HTML)
    Par naouah dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 25/02/2009, 21h49
  3. [HTML] Macro pour modifier plusieur fichier html
    Par naouah dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 16/01/2009, 09h40
  4. [HTML] Ouvrir plusieurs fichiers pdf dans une page
    Par PrinceMaster77 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/05/2006, 09h34
  5. Réponses: 2
    Dernier message: 03/03/2006, 20h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo