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 :

Analyse de fichier et mise en forme


Sujet :

Langage Perl

  1. #1
    Membre du Club Avatar de blacksnake
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Points : 69
    Points
    69
    Par défaut Analyse de fichier et mise en forme
    Bonjour,

    Débutant en Perl, je reçois des fichiers de reporting tous les matins et ils doivent être nettoyés avant de pouvoir être exploités. J'utilise un script comme celui-ci pour réaliser l'opération. Ma question est comment éviter l'étape " (NEW, ">tmp.csv") ".

    Merci de votre aide

    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
     
    #!/usr/bin/perl -w
     
     
    @T      = localtime(time-86400);
    $mydate = sprintf("%04d%02d%02d",($T[5]+1900),$T[4]+1,$T[3]);
    $mvno_f = "reporting_eai_siebel_mvno_$mydate\.csv";
     
    open(MAINFILE, "$mvno_f") || die "Can't open file\n";
      @mvno_r = <MAINFILE>;
    close(MAINFILE);
     
    foreach (@mvno_r) {
        # Lignes à supprimer
        $_ = "" if ($_ =~ m/Nb lignes/);
        $_ = "" if ($_ =~ m/DSI CRM_ERR_EXP/);
        chomp $_;
    }
     
    open(NEW, ">tmp.csv") || die "Can't open file\n";
      foreach (@mvno_r) {
        print NEW $_."\n" if ($_);
      }
    close(NEW);
     
    # Ajout des sauts de lignes par catégorie
    open(FILE, "tmp.csv");
     
      open(NEW, ">result.csv");
      while(<FILE>) {
        $_ =~ s/^AR/\nAR/;
        $_ =~ s/^CR/\nCR/;
     
        print(NEW "$_");
      }
      close(NEW);
     
    close(FILE);  
    unlink("tmp.csv");

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 47
    Points
    47
    Par défaut
    Hugh,

    Si j'ai bien compris ton script:
    1 - tu charges un fichier dont le nom est stocké dans la variable '$mvno_f' dans un tableau,
    2 - tu vires quelques menues lignes,
    3 - tu enregistres le tout dans un fichier temporaire
    4 - tu r'ouvres ce fichier temporaire pour modifier certaines lignes...

    Effectivement, c'est optimisable
    1 - D'abord éviter de passer par le chargement complet du fichier dans un tableau (en cas de gros gros fichier, la ram explose)
    2 - Opérer tous les changements en une seule passe, ligne par ligne: je charge une ligne, je fais les modifs et je l'enregistre si besoin.

    Ca donne à peu près ce code là...

    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
     
    #!/usr/bin/perl -w
     
    @T      = localtime(time-86400);
    $mydate = sprintf("%04d%02d%02d",($T[5]+1900),$T[4]+1,$T[3]);
    $mvno_f = "reporting_eai_siebel_mvno_$mydate\.csv";
     
    open(MAINFILE, "$mvno_f") || die "Can't open file\n";
    open(NEW, ">result.csv")
    while(<MAINFILE>) {
      chomp(); # Perso je préfère un 's/(\r|\n)//g;'
      # Lignes à supprimer
      next if ($_ =~ m/Nb lignes/);
      next if ($_ =~ m/DSI CRM_ERR_EXP/);
      $_ =~ s/^AR/\nAR/; # la ligne 's/^AR/\nAR/;' est équivalente
      $_ =~ s/^CR/\nCR/;
     
      print(NEW "$_\n");
    }
    close(NEW);
    close(MAINFILE);
    Dis nous si ça fonctionne ou non...

    PluX59

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,

    pour des raisons de paresse j'a pris le code de PluX59 et voilà ce que ça donne
    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
    #!/usr/bin/perl -w
     
    @T      = localtime(time-86400);
    $mydate = sprintf("%04d%02d%02d",($T[5]+1900),$T[4]+1,$T[3]);
    $mvno_f = "reporting_eai_siebel_mvno_$mydate\.csv";
     
    open MAINFILE, "$mvno_f" or die "E/S : $!\n";
    open NEW, ">result.csv"  or die "E/S : $!\n";
     
    while(<MAINFILE>) {
      # chomp(); # Perso je ne chomp pas
      # Lignes à supprimer
      next if /Nb lignes|DSI CRM_ERR_EXP/;
      s/^([AC]R)/\n$1/; 
      print NEW $_;
    }
    close NEW;
    close MAINFILE;
    lami20j
    --
    lami20j

  4. #4
    Membre du Club Avatar de blacksnake
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Points : 69
    Points
    69
    Par défaut
    YES

    Ca marche, nikel. Merci à vous. J'ai pris le code de Plux ce matin, vais tester le tiens, Lami.

  5. #5
    Membre du Club Avatar de blacksnake
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Points : 69
    Points
    69
    Par défaut
    Je cherche pour ce même programme à afficher la taille du fichier, mais je souhaiterais qu'elle soit formatée :

    1500 bytes ==> 1 500 bytes

    J'ai regardé du coté de sprintf mais pas trouvé l'info ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $size = -s "../htdocs/report_done/mvno.csv";
    $size_mvno = sprintf( "%0.3f", $size/1000);

    Merci

    EDIT

    http://www.developpez.net/forums/showthread.php?t=35093

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

Discussions similaires

  1. Réponses: 41
    Dernier message: 02/05/2006, 14h17
  2. [DOM XML] Mise en forme du fichier
    Par fragmonster dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 02/03/2006, 12h02
  3. [Librairies] fichier cvs; problème de mise en forme
    Par illegalsene dans le forum CVS
    Réponses: 3
    Dernier message: 19/10/2005, 15h35
  4. Mise en forme fichier xls à partir d'access
    Par Bigdeal dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/09/2005, 15h47
  5. Mise en forme fichier avant Import
    Par jeff37 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/04/2004, 15h16

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