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 :

Modifier un fichier


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut Modifier un fichier
    Bonjour,
    Je voudrais modifier un fichier qui a le format suivant :
    WID2 2005/02/04 11:05: 0.055 BARC LHE XXX CM6 359989 100.000000 90.0 0.0
    STA2 SEDZ 9.16300 -83.33600 WGS-84 0.375 0.000
    DAT2
    eV3tyDVAt-X2dFUOl+tCNZ8X0r-oBrNXTkQYDVDc+aOlMrTVJUIW9oQVKl8r0kPbPVFY5o4r9UGVHmPU
    ...
    CHK2 59345435
    WID2 2005/02/04 11:05: 0.055 BARC LHZ XXX CM6 359989 100.000000 -1.0 0.0
    STA2 SEDZ 9.16300 -83.33600 WGS-84 0.375 0.000
    DAT2
    ilKymJPUEUOkGV3MURlOFIVLUQUOmDnImQW3Y8UQ9l9WHV1KUOnGoFl+l3UKY4X6GlDUTVSlBmKkQmBV
    JUNkKX7X
    ...
    CHK2 59345435
    En gros, le header commence avec les lignes WID2, puis STA2 et DAT2 annonce l'arrivée des données. Les données se finissent par la ligne qui commence par CHK2. Et ainsi de suite.

    Je voudrais modifier les lignes WID2 et STA2 en fonction de ce qu'elles contiennent. C'est à dire, par exemple, modifier XXX en fonction de ce que l'on ait LHE ou LHZ comme paramètre précédant.

    Qu'elle technique me conseillez-vous? Ouvrir le fichier en lecture-écriture et faire les modifs au cours de la lecture? Ou mettre le fichier entier (qui est assez gros) dans une variable et utiliser les regex avec le paramètre s///g et écraser le fichier avec la nouvelle variable ainsi créée?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,
    je pense qu'une parite de la réponse se trouve ici : Changer une ligne dans un fichier

    Bon courrage

    [edit]Désolé, je n'avai pas vu qu'il s'agissait du même posteur![/edit]

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Salut

    Je te propose le script suivant qui est, à mon avis, une base pour tes futurs développements :
    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
     
    #!/usr/bin/perl -w
     
    use strict;
    use Carp;
     
    sub rename_file {
    	unlink $_[0] and rename ($_[1], $_[0]) and unlink $_[1];
    }
    #Fichier en lecture
    open FILE,"< peuf.txt" or die "$!\n";
    #Fichier en ecriture
    open FILE_DEST,"> peuf2.txt" or die "$!\n";
    while(<FILE>){
    	chomp;
    	#On prend exemple la modification de WID2
    	if(/WID2/){
    		#On va supposer que l'on modifie si on trouve LHE
    		if (/LHE/){
    			s/LHE\s.{3}\s/LHE 000 /;
    			print FILE_DEST $_."\n";
    		}
    		else {
    			print FILE_DEST $_."\n";
    		}
    	}
    	else {
    		print FILE_DEST $_."\n";
    	} 
    }
    close FILE and close FILE_DEST;
     
    rename_file("peuf.txt", "peuf2.txt");
    Le code s'aide d'une regexp pour modifier ce que tu souhaites.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Merci pour tes conseils...
    Il y a des parties que je ne comprends pas dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sub rename_file {
       unlink $_[0] and rename ($_[1], $_[0]) and unlink $_[1];
    }
    Et aussi pourquoi faire un chomp?
    chomp;
    Sinon, c un peu cette méthode que j'avais imaginé, mais les modifs sont telement complexes finalement, que je préfère mettre la ligne dans un array, modifier cet array (sans passer par s///)

  5. #5
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Salut

    Concernant cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub rename_file {
       unlink $_[0] and rename ($_[1], $_[0]) and unlink $_[1];
    }
    Elle prend 2 arguments : le premier est le fichier d'origine, le 2ème est le fichier temporaire. La fonction unlink permet de supprimer un fichier. Ce qui dans l'ordre fait : je supprime le fichier d'origine, je renomme le fichier temporaire avec le nom du fichier d'origine et je supprime le fichier temporaire.

    La fonction chomp permet d'enlever dans une chaîne de caractères tout caractère d'échappement (les fameux retours chariots \n).

    Mais non, c'est pas compliqué les regexp.

    Apparemment tu sembles débutants, je te conseille donc de te rendre sur la page index de la rubrique Perl de ce forum qui te permettra d'accéder à mes cours d'initiation à Perl ainsi qu'à la FAQ que je t'invite à consulter fréquemment

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Merci... oui c vrai je débute en perl. Merci pour tes indications

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/02/2012, 11h57
  2. [JexcelAPI]Modifier un fichier excel
    Par sissi_l dans le forum Documents
    Réponses: 3
    Dernier message: 01/06/2007, 01h36
  3. [DOM] [Débutant(e)] Modifier un fichier XML avec DOM
    Par macks dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 05/07/2005, 14h13
  4. [jar] Comment modifier un fichier jar
    Par newfsch dans le forum JBuilder
    Réponses: 5
    Dernier message: 18/07/2004, 14h25
  5. [LG]modifier un fichier
    Par fofovi72 dans le forum Langage
    Réponses: 3
    Dernier message: 15/04/2004, 21h30

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