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

Shell et commandes GNU Discussion :

Remplacer plusieurs sections d'un fichier contenues dans un autre fichier


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Par défaut Remplacer plusieurs sections d'un fichier contenues dans un autre fichier
    Bonjour à tous,

    Bon voilà plusieurs jours que je m'échine à trouver une solution à un problème qui, au départ, me semblait facile : copier coller des passages d'un fichier vers un autre....
    Toujours est-il que je n'y arrive pas.
    J'ai deux fichiers Html très longs (plusieurs centaines, milliers de pages).. J'ai un fichier disons Origine dont je dois remplacer des passages par d'autres contenus dans le fichier Beta. J'ai pratiquement 1000 remplacements à faire.

    Dans Origine j'ai des indices (ex :id="FO23P") qui me permette de trouver quels sont les passages que je dois remplacer.
    Dans Beta, je n'ai pas d'indice, juste des titres des passages.

    Fichier Origine :
    blabla
    id="FO23P" < titre1 >
    blabla ..end
    blabla
    id="FT12I" < titre2 >
    blabla ...end
    blabla ...

    Fichier Beta
    blibli
    < titre23 >
    bliblibli end
    blibli
    < titre3 >
    blibli end
    blibli


    Mon plan de départ était de :
    1) construire des indices identiques dans Beta à partir des titres (ex si titre = "Lesson 18 Formation l'Originalité par Jean" alors idA="FO18J", en faisant d'abord un recherche sur Formation, si OK then idA="F" recherche sur Orinalité si ok idA=idA+"O" etc), d'inclure ce nouvel indice juste avant le titre du passage dans BETA.
    2) Repérer le passage (je pense avoir trouvé une balise de fin ),par l'indice idA, comparer id et idA, si OK remplace le passage de Origine par passage dans Beta.

    j'ai essayé en Python avec des expressions regex mais le copier coller n'est pas son fort. Je me suis alors rappeler que Bash pourrait surement etre plus efficace ...

    Mais je ne suis qu'un pauvre (Hélas) économiste, j'ai bien touché un peu à Bash il y a des années mais ... echec

    pour 1) j'ai essayé d'utiliser un grep puis un if sur le grep pour construire l'indice idA , mais je ne sais pas faire une boucle correcte sur le grep.

    N'ayant toujours pas réussit le 1); je ne me suis pas attaqué au 2)


    Si vous pouviez m'aider je vous en serais bien reconnaissant,

    Ghislain

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Les titres du fichier Origine et celui du fichier Beta ne sont pas les mêmes ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Par défaut
    non pas exactement ils ont souvent des différences, parfois un peu aléatoires...

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Est-ce que tu peux préciser comment tu reconstruis l'ID ? Parce que là, on comprend rien.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Par défaut
    l'id dans origine a une certaine logique par exemple d'abord une lettre pour une grande catégorie : F pour formation, E pour expérimentation etc ...; deuxième lettre pour sous catégorie par exemple : L,M,X,J,V,S,D pour les jours de la semaine; un nombre qui correspond à par exemple le numero de l'expérimentation ou de la formation, parfois une autre lettre pour un autre critère

    Pour construire l'idA je vais chercher dans le titre l'ensemble de ces informations et je construit le nouvel index
    un bout de mon code que j'avais commencé en python :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    pattern= '<div class="tit1(.+?)>(.+?)</div>' # je capte le titre
    dotall = re.compile(pattern,re.DOTALL)
    tutuall=dotall.findall(monfichier)# retrouve toute les occurences et les mets dans une liste, que je vais pourvoir "iterer"
    iterator = dotall.finditer(monfichier)
    iterator  
    i=0
    for match in iterator:
        print("__________ debut de boucle ______", i, "\n")
        a=match.group(0)
        b=match.group(1)
        c=match.group(2) # c'est dans le groupe 2 que ce trouve mes info pour faire le nouvel indice
    # je commence mon identification en suivant ce que je dois obtenir pour faire correspondre à id dans le fichier Origine 
        if "Avent" in c :
            idA="F"+"A"
        if "Noël" in c :
            idA="F"+"N"
        if "rdinaire" in c :
            idA="F"+"O"
        if "arême" in c :
            idA="F"+"C"
        if "ainte" in c :
            idA="F"+"T"
    #A ce moment idA=FA, ouFC ou autres deux lettres
     
          if "remière semaine" in c:
                idgdr=idgdr+"1"
          if "euxième semaine" in c:
                idgdr=idgdr+"2"
          if "roisième semaine" in c:
                idgdr=idgdr+"2"
          if "uatrième semaine" in c:
                idgdr=idgdr+"4"  
    #je rajoute le numéro idA="FC4" ou autre
        if "imanche" in c :
            idgdr=idgdr+"D"
        if "undi" in c :
            idgdr=idgdr+"L"
        if "ardi" in c :
            idgdr=idgdr+"M"
        if "ercredi" in c :
            idgdr=idgdr+"X"
        if "eudi" in c :
            idgdr=idgdr+"J"
        if "endredi" in c :
            idgdr=idgdr+"V"
        if "amedi" in c :
            idgdr=idgdr+"S"
    #je rajoute encore une lettre pour le jour de la semaine  idA=FC4M
    #etc sur autres critères
    j'avais fais mes "if" de façon à ce qu'il correspondent à l'ordre qui va bien dans id

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Bonjour,

    Le code python que tu nous as donné calcul bien ton idA ?

    Ce qu'il te manque c'est comment l'insérer dans ton fichier Bêta ?

    Bref, c'est pas clair tout ça...

    Tu n'as pas un exemple concret de ce que tu veux en résultats avec une dizaine de lignes du fichier Origine et une dizaine de lignes du fichier Bêta ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Par défaut
    Je pensais être clair mais apparemment avoir passer plusieurs jours sur la question a du obscurcir mon cerveau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Fichier Original
    id="FO23LP" "titre de ce passage : Un cerveau en forme "
    le passage est tres clair pour un cerveau en forme
    fin du passage div>
     
    mais le texte continue sur plusieurs pages blabla
     
    id"FO12MI"  "titre nouveau il faut changer"
    encore du texte qu’il faudra changer
    il peut etre long ou court etc ...
    fin du passage div>
     
    et le texte continue blabla blalbalbabla
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    fichier Beta
    Le fichier beta est assez long lui aussi, il n'a pas d'id mais par contre ses titres sont plus clairs
    <div class="iti1" Formation Originale du Mardi la leçon 12
    est celle des semaines Impaires" div>
    TOTO est grand
    fin du passage div>
    bla bla tu texte
    <div class="iti1" la leçon 23
    est celle  des semaines Paires Formation Originale du Lundi, " div>
    Ici on a un nouveau TEXTE très très intéressant qu'il faudra impérativement mettre au bon endroit
    fin du passage div>
    blabla bla
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Le fichier que je veux
    Fichier Original
    id="FO23LP" "titre de ce passage : Un cerveau en forme "
    ci on a un nouveau TEXTE très très intéressant qu'il faudra impérativement mettre au bon endroit
    fin du passage div>
     
    mais le texte continue sur plusieurs pages blabla
     
    id"FO12MI"  "titre nouveau il faut changer"
    TOTO est grand
    fin du passage div>
     
    et le texte continue blabla blalbalbabla
    Les étapes
    1) fabriquer un Ida dans le fichier Beta qui corresponde à l'id du fichier Originel (qui me permettra de mettre en correspondance les passages dans les étapes suivantes)
    2) insérer ce nouvel Ida dans le fichier Beta au début de chaque passage auquel il correspond
    3 )Pour chaque ida ,dans Beta,copier le passage jusqu'à fin du passage div>
    4) Rechercher id, dans Originel, qui correspond à ida, sélectionner le passage entre fin titre et fin du passage div> et remplacer par le passage sélectionné en 3)


    J'ai effectivement réussi à faire plus ou moins l'étape 1 en python (auquel je ne connaissais rien il y a 4 jours), mais insérer du texte dans un fichier texte à un endroit précis semble très difficile en python.
    Je sais que la commande sed doit le faire assez facilement. Donc j'abandonne cet essais en python, j'essaie autre chose


    Avec un grep -P "(?s)tit1(.+?)div" Beta.txt j'arrive à avoir tous les titres de Beta.
    Je voudrai les reprendre un par un pour construire l'ida.
    Comment construire ida? Je cherche "Formation " dans le titre sélectionné si il est présent ida="F", si je trouve "Original" ida=ida+"O", si je trouve "un nombre" ida=ida+"le nombre", etc ... jusqu'à former l'ida.
    Pour l'instant je bloque déjà ici car je n'arrive pas à faire une boucle sur le grep. Il doit y avoir un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    faire 
    grep -P "(?s)tit1(.+?)div" Beta.txt [i] # ieme renvoit de grep
    comandes construisant ida à partir du texte trouver par grep
    insertion de ida à la bonne place
    tant que i existe
    Une fois ida construit je pourrai passer aux étapes suivantes

    J'espère que j'ai été plus clair, j'ai essayé mais c'est pas sur ....

    Ghislain

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Voici un début en awk qui rajoute les tags par rapport au fichier bêta:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    $ cat trtbeta.awk 
    BEGIN{
        week["Lundi"]="L";
        week["Mardi"]="M";
        week["Mercredi"]="X";
        week["Jeudi"]="J";
        week["Vendredi"]="V";
        parite["Impaire"]="I";
        parite["Paire"]="P";
    }
    /"iti."/,/ div>/{
        if(flag==1){
            A=A"\n"$0;
        }
        else{
            A=$0;
            flag=1;
        }
        next;
    }
    flag==1{
        flag=0;
        if(A ~ /Formation/){
            ida="F";
        }
        if(A ~ /Originale/){
            ida=ida"O";
        }
        match(A,/ ([0-9]+)[ \n]/,C);
        ida=ida""C[1];
        for (i in week){
            if(A ~ i){
                ida=ida""week[i];
                break;
            }
        }
        for (i in parite){
            if(A ~ i){
                ida=ida""parite[i];
                break;
            }
        }
        $0=ida"="A"\n"$0;
        A="";
        ida="";
    }
    {print $0}
    Et celui-ci s'éxecute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ awk -f trtbeta.awk beta 
    fichier Beta
    Le fichier beta est assez long lui aussi, il n'a pas d'id mais par contre ses titres sont plus clairs
    FO12MI=<div class="iti1" Formation Originale du Mardi la leçon 12
    est celle des semaines Impaires" div>
    TOTO est grand
    fin du passage div>
    bla bla tu texte
    FO23LP=<div class="iti1" la leçon 23
    est celle  des semaines Paires Formation Originale du Lundi, " div>
    Ici on a un nouveau TEXTE très très intéressant qu'il faudra impérativement mettre au bon endroit
    fin du passage div>
    blabla bla
    Ensuite, il faudrait savoir comment déterminer la fin d'un chapitre.
    Sinon, personnellement, je parcourerais le fichier bêta en fabriquant les tag de chaque chapitre et ceux-ci me servirait d'indice d'un tableau qui contiendrait le texte de remplacement du fichier original et ensuite je parcourais le fichier original pour faire les changements adéquates.
    Comme ceci, on ne fait qu'une seule passe sur chaque fichier.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2016
    Messages : 5
    Par défaut
    Merci ça marche pour fabriquer l'indice
    Petite précision pour faire fonctionner match(A, /([0-9]+)[ \n]/, C); j'ai du utiliser gawk ... apparemment awk n'accepte que deux attributs.

    pour la suite : en fait le fichier beta est un peu plus simple ... le passage que je dois sélectionner se fini toujours par un autre passage qui commence par un autre ida ...Mais dans le passage qu'il faut sélectionner il y a des lignes vides, des retours à la ligne ...

    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
     
     
    fichier Beta
    Le fichier beta est assez long lui aussi, il n'a pas d'id mais par contre ses titres sont plus clairs
    <div class="iti1" Formation Originale du Mardi la leçon 12
    est celle des semaines Impaires" div>
    TOTO est grand
     
    fin du passage div>
     
    <div class="iti1" la leçon 23
    est celle  des semaines Paires Formation Originale du Lundi, " div>
    Ici on a un nouveau TEXTE très très intéressant qu'il faudra impérativement mettre au bon endroit
    fin du passage div>
    blabla bla
    du coup avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        $0="<DEBUT"ida"FIN""="A"\n"$0; # JE rajoute <DEBUT et FIN pour mieux le retrouver dans le texte
        SELECTION="<DEBUT"ida"FIN(.+?)<DEBUT";#je voudrais sélectionner le passage correspondant à ida et le mettre dans le tableau ... mais il y a le pb des retour à la ligne et des lignes vides ??
        Var[ida]=SELECTION;
        A="";
        ida="";
    et je ne vois pas comment remplacer dans un autre fichier ... (ok pour le marqueur de fin de passage identifié dans original "div>" , mais faut-il faire un deuxième awk dans le awk ???)

Discussions similaires

  1. Boucle copier coller entre 2 fichiers pour chaque ligne
    Par cheerleaders dans le forum Excel
    Réponses: 3
    Dernier message: 19/05/2015, 18h09
  2. Copier / Coller entre 2 fichiers excel
    Par roberto75 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/03/2011, 12h25
  3. Copier coller entre deux fichiers excel par macro
    Par miss-o-21 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/11/2009, 14h45
  4. Copier-coller entre fichier CSV et XLS
    Par da991319 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/09/2007, 21h42
  5. VBA-E: Pb copier-coller entre Excel et .csv
    Par tiger118 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/06/2006, 11h08

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