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 :

comment travailler sur deux fichiers en PERL


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2019
    Messages : 2
    Par défaut comment travailler sur deux fichiers en PERL
    Bonjour,

    J'ai besoin de votre aide je souhaite savoir s'il est possible en PERL de récupérer un champ d 'un fichier pour le mettre en fin de ligne d'un autre fichier
    Je m'explique

    fichier 1
    123456 (champs variable) toto
    254623 titi

    fichier 2
    123456 (champs variable)
    254623

    je voudrais récupérer toto et titi du fichier 1 et le rajouter en fin de ligne correspondante du fichier 2


    Merci d'avance de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Il faut commencer par lire entièrement le premier fichier et stocker en mémoire (par exemple dans un tableau ou un hachage) les informations de ce fichier que tu veux recopier.

    Ensuite, il n'est généralement pas possible de modifier directement un fichier séquentiel comme le fichier 2. La stratégie habituelle consiste normalement à lire le fichier_2, faire les changement voulus au contenu et écrire le résultat dans un troisième fichier (fichier_3). Une fois cette opération faite et les fichiers refermés, il suffit (si nécessaire) de renommer les fichiers, par exemple fichier_2 en fichier_2_old puis fichier_3 et fichier_2.

    Perl offre dans certains cas simples un moyen d'automatiser les opérations décrites au deuxième paragraphe ci-dessus, l'option -i, mais dans ton cas, il serait sans doute plus simple d'effectuer les opérations décrites ci-dessus manuellement.

  3. #3
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Hello,

    Oui c'est tout à fait possible :

    - ouverture du fichier 1 en lecture
    - ouverture du fichier 2 en écriture/ajout
    - rechercher la ligne contenant "toto" du fichier fichier 1
    - écrire cette même ligne dans le fichier 2 ( qui se fera à la suite du contenu déjà présent )
    - rechercher la ligne contenant "titi" du fichier fichier 1
    - écrire cette même ligne dans le fichier 2
    - fermeture du fichier 1
    - fermeture du fichier 2

    Pour ce qui est du code tu devrais pouvoir trouver par toi même
    Au cas où, poste ce que tu as déjà fait il y aura certainement quelqu'un pour corriger

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Euh, juste une interrogation: ta question porte vraiment sur Perl 6 comme le dit l'objet du fil?

  5. #5
    Nouveau candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2019
    Messages : 2
    Par défaut
    Merci de vos réponses

    voila le bout de code mais j'ai un soucis pour lire pour deuxième fichier car il y a des chapeau M en début de ligne
    j'ai vu qu'il il avait le buff mais je sais pas comment il fonctionne.


    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
        # Ouverture fichier 1
        # -----------------------------------
        unless( open(FSP,"<$Harg{Fichier 1}") ) {
            $oDesc->log_error("Ouverture [$Harg{fichier 1}] impossible [$!]") ;
            $retour = 2 ;
        }
        return( $retour ) if $retour != $SUCCESS ;
     
        #open du 2e fichier 
        #------------------------------------
            unless( open(FSP,"<$Harg{fichier 2}") ) {
            $oDesc->log_error("Ouverture [$Harg{fichier 2}] impossible [$!]") ;
            $retour = 2 ;
                        }
        return( $retour ) if $retour != $SUCCESS ;
     
     
        # Creation fichier resultat
        # --------------------------
        $fihier 3 = gensym() ;
        unless( open( $fichier 3,">$Harg{fichier 3}") ) {
            $oDesc->log_error("Creation [$Harg{fichier 3}] impossible [$!]") ;
            $retour = 3 ;
        }
        return( $retour ) if $retour != $SUCCESS ;
     
        # Balaie 1er fichier recu et recupere les valeurs dans un fichier de format pour créer une table de hachage
        # -------------
            $recup = $oDesc->get_champ( 1, 'valeur' ) ;
            $recup 1 = $oDesc->get_champ( 1, 'valeur 1' ) ;
            $Hmem{$recup} = $recup 1 ;
     
        }
        close(FSP) ;
        $oDesc->log_info(": fin [$retour] (0=ok)");
     
        # plus complique lecture du 2e fichier car il y a des controle M
     
        {
        local $\='' ?
        $buf = <F>
        }
        @ligne = split /\r/, $buf;
     
        # attention 1e ligne qui est fixe et ne doit pas être changée(entête)
        print FNEW shift(@ligne), "\r" ;
        foreach $lig (@ligne) {
            $recup = substr($lig, valeur1, 15);
            if (exists($Hmem{$recup}) ) {
                print FNEW $lig, $Hmem{$recup}, "\r" ;
            }
            else {
                ERREUR
            }
        }
        close FNEW
     
        close($fichier 1)
     
        close($fichier 2) ;
    }

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    ton code me laisse perplexe à plusieurs égards.

    D'abord, tu as mis le tag [Perl 6], mais ce n'est pas du code Perl 6 (ça ressemble à du Perl 5).

    Le code étant incomplet, on ne peut pas le tester (déclaration et définition du hachage %Harg absente, définitions des fonctions/méthodes log_error, get_champ et gensym absentes, déclarations et définitions de la variable $retour et de la constante $SUCCESS absentes, je ne sais pas ce qu'est oDesc, etc.).

    Ensuite, il y a de nombreuses lignes avec une syntaxe incorrecte, je ne pense pas que ça puisse compiler correctement.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $fihier 3 = gensym() ;
    Outre la faute d'orthograhe probable sur le mot fichier, le 3 en plein milieu, séparé de la variable par un espace, n'a aucun sens. Peut-être veux-tu quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $fichier_3 = gensym() ;
    Idem pour $recup 1 = ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        # Balaie 1er fichier recu et recupere les valeurs dans un fichier de format pour créer une table de hachage
        # -------------
            $recup = $oDesc->get_champ( 1, 'valeur' ) ;
            $recup 1 = $oDesc->get_champ( 1, 'valeur 1' ) ;
            $Hmem{$recup} = $recup 1 ;
     
        }
    Je ne sais pas ce que fait $oDesc->get_champ, mais je doute fort que ce code puisse balayer le premier fichier reçu. J'ai déjà parlé de $recup 1. Que fait l'accolade fermante en bas du code ci-dessus? Je ne vois pas d'accolade ouvrante correspondante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        {
        local $\='' ?
        $buf = <F>
        }
    Encore une syntaxe bizarre. Que vient faire ce point d'interrogation? Où est déclaré $buf? Où est ouvert le descripteur de fichier F?

    Une façon normale de lire un fichier et d'éliminer les contrôle M serait par exemple (en supposant le file handler F dûment ouvert):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my @lines;
    while (my $ligne = <F>) {
        $ligne = s/[\r\n]+//g; # retire les caractères de fin de ligne, y compris les ctrl M
        push @lines, $ligne;
    }
    C'est quoi, ERREUR dans ce code?
    Et ainsi de suite...

    La première chose à faire est d'ajouter les deux lignes suivantes au début de ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    et de corriger toutes les erreurs et tous les avertissements détectés (en particulier, déclare toutes les variables utilisées avec my). Quand tu auras fait cela et que ton code compilera correctement, tu auras fait un grand pas en avant. Et reviens vers nous en présentant l'ensemble du code ainsi corrigé si tu as encore des difficultés. Il y aura certainement d'autres choses à corriger ou à améliorer dans ton code, mais, au moins, on y verra déjà beaucoup plus clair.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/05/2007, 11h52
  2. [VBA-E]travail sur deux classeurs excel
    Par richou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/04/2006, 10h59
  3. [Procédure stockée] Comment travailler sur une liste de ...
    Par WwiloO dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/02/2006, 11h22
  4. Réponses: 7
    Dernier message: 23/03/2005, 22h23
  5. [Excel] Travailler sur un fichier excel existant
    Par scoder dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 26/10/2004, 12h54

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