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 :

Regex pour traitement CSV


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut Regex pour traitement CSV
    Bonjour,
    J'ai exporter des données en CSV d'un logiciel, cela marche a 70%, mais j'ai besoin de faire des tratiement sur ce fichier pour qu'il soit correcte.
    En effet sur certains de mes enregistrements il existe un saut de ligne au milieu d'une ligne.
    Par exemple :

    1001;BOLLET
    1029;BALESTRA
    3 lot du Gâteau 37510 BURNIN;Public
    1035;ROMAN
    1039;OUSTRIERE
    15, rue de la Trucutu 38110 SAINT TOTO;Public


    Mes lignes doivent toutes commencées par un identifiant, ici 1001,1024 1035,1039
    cependant allez savoir pourquoi un saut de ligne s'est ajouté avant le "3 lot..." et avant le "15, rue..."

    Je voudrais donc faire sauter ces fins de lignes.Ici les saut de lignes se sont rajouté 2 fois avant le champs [adresse] mais c'est une pure coincidence.

    Je travail sous linux, avec des sed... mais je suis ouvert à n'importe quelle solution, bash, perl, php...

    Je pense quil faudrait faire quelque chose du type si il existe un saut de ligne suivit de quelque chose de différent de XXXX;Une majuscule repeter une 15aine de fois alors enlever le saut de ligne . Mais j'ai vraiment aucune idee de comment faire ca.


    Merci pour votre aide!!

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Faut que je vois si j'ai le droit de te réorienter vers le forum perl, parce que j'ai ce petit snippet pour toi :


    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/perl
    use warnings;
     
    my $string = "1001;BOLLET
    1029;BALESTRA
    3 lot du Gâteau 37510 BURNIN;Public
    1035;ROMAN
    1039;OUSTRIERE
    15, rue de la Trucutu 38110 SAINT TOTO;Public";
     
    my $pattern = '\n(^(?![0-9]{4};[A-Z]{4}))';
     
    $string =~ s/$pattern/$1/gm;
    print $string;

    Pas besoin de php si tu bosses sur le shell.

    J'ai pris 4 majuscules à suivre, à toi de voir si ça suffit...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Citation Envoyé par jml94 Voir le message
    Faut que je vois si j'ai le droit de te réorienter vers le forum perl, parce que j'ai ce petit snippet pour toi :


    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/perl
    use warnings;
     
    my $string = "1001;BOLLET
    1029;BALESTRA
    3 lot du Gâteau 37510 BURNIN;Public
    1035;ROMAN
    1039;OUSTRIERE
    15, rue de la Trucutu 38110 SAINT TOTO;Public";
     
    my $pattern = '\n(^(?![0-9]{4};[A-Z]{4}))';
     
    $string =~ s/$pattern/$1/gm;
    print $string;

    Pas besoin de php si tu bosses sur le shell.

    J'ai pris 4 majuscules à suivre, à toi de voir si ça suffit...


    Merci, cela marche bien sur le script que tu m'as envoyé, j'ai juste remplacer $1 par un ;$1.

    En revanche j'arrive pas à faire l'equivalent avec un sed -->
    sed -e ' s/\n(^(?![0-9]{4};[A-Z]{4}))/;\0/g' monfichier

    Peut etre que mon fichier ne ressemble pas exactement à la chaine qui j'ai ecrit dans mon topic...

    Dans le script perl:
    Quand j'essaye de mettre un fichier dans $string ma chaine est coupé au premier saut de ligne, je ne connais pas bien le perl.
    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
    #!/usr/bin/perl
    use warnings;
    open(FH,"cat /distant/julienb/Desktop/koha/utilisateurokutf8|");
    my $string =<FH>;
    print $string;
    exit;
    #my $string = "1001;BOLLET
    #1029;BALESTRA
    #3 lot du Gâteau 37510 BURNIN;Public
    #1035;ROMAN
    #1039;OUSTRIERE
    #15, rue de la Trucutu 38110 SAINT TOTO;Public";
     
    my $pattern = '\n(^(?![0-9]{4};[A-Z]{4}))';
     
    $string =~ s/$pattern/;$1/gm;
    print $string;
    ./testperl.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    julienb@julien:~/script$ ./testperl.pl 
    Identifiant;Nom personne;Prénom;Genre;Commentaire;MailList;Sujet;Adresse;Service;EMail;Date_inscription;Date_modif_MDP;Nb connexion;Niv_Aut;ID_Site_Origin;SMTP_Server;Signature;Code_groupe;Aut_cons;Aut_mod;Last_doc;Cat_Emprunt;Nb emprunts;Nb demandes;Nb_Emp_autor;Nb_jours_autor;Date_limite_emp;Comment_emprunt;Téléphone;Adhésion;Caution;Catégorie;Association;Règlement
    julienb@julien:~/script$
    Est-il possible de travailler sur un fichier entier ou suis-je obligé de travailler ligne par ligne?

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Je ne suis pas un grand spécialiste de sed que j'utilise assez peu. Dès que ça devient compliqué, je passe sur le chameau (l'emblême de Perl depuis le magnifique bouquin d'O'Reilly)... Du coup, je ne sais pas bosser avec en multilignes, et je ne sais pas s'il accepte les assertions dans les expressions régulières.

    J'ai bien eu ton fichier en MP, et le premier truc, c'est qu'il y a des identifiants sur 2, 3 et 4 chiffres et Le nom peut être une seule majuscule.
    Donc adaptation de l'expression :

    Code perl : 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
     
    #!/usr/bin/perl
    use warnings;
     
    # lecture de tout le fichier dans un buffer
    open(FH, 'data.txt');
    my $content;
    $content .= $_ while (<FH>);
    close(FH);
     
    # construction du motif de la regex
    my $pattern = '\n(^(?![0-9]{2,4};[A-Z]))';
     
    # application du motif en mode multilignes
    $content =~ s/$pattern/$1/m;
     
    # copie dans un fichier résultat
    open(FH, '>result.txt');
    print FH $content;
    close(FH);

    Je te laisse tester avant de détruire ton fichier.

    PS : je nous déplace dans le forum des mongueurs, ils auront l'oeil sur moi au cas où je dis des conneries...

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    C'est pas mal, excepté la lecture du fichier entier en mémoire qui est un peu couteuse... Et pas nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -0073 -pe 's/\n(?!\d{2,4};)/ /' file.csv
    devrait suffire, si je ne m'abuse.

    --
    Jedaï

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Merci tout le monde.

    Je ne comprend pas pourquoi mais la solution de jml94 fonctionne mais me fait sauter que 2 saut de lignes alors que al solution de jedai est beaucoup plus concluante.

    D'ailleur tu pourrais expliquer l'expression Jedai, je ne la comprend pas bien :-). Et les options de perl aussi :-).

    Merci pour votre aide en tout cas!!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Citation Envoyé par jml94 Voir le message
    C'est bizarre, il me semblait que mon script marchait hier soir sur ma ubuntu.
    Ce matin sur du windows, c'est pas terrible...
    Bizarre effectivement...

  8. #8
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    HALTE, erreur de recopie, j'ai oublié le paramètre de remplacement global g.

    Pour mon script, ça donnerait :

    Code perl : 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
    #!/usr/bin/perl
    use warnings;
     
    # lecture de tout le fichier dans un buffer
    open(FH, 'file.csv');
    my $content;
    $content .= $_ while (<FH>);
    close(FH);
     
    # construction du motif de la regex
    my $pattern = '\n(?![0-9]{2,4};[A-Z])';
     
    # application du motif en mode multilignes
    $content =~ s/$pattern//gm;
     
    # copie dans un fichier résultat
    open(FH, '>result.txt');
    print FH $content;
    close(FH);
    Je me suis inspiré du conseil de Jedai : pas de capture pour la perf, pas de test de début de ligne, inutile après un caractère de saut de ligne \n

    En ligne de commande, ça donnerait
    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -0077 -pe "s/\n(?!\d{2,4};[A-Z])//mg" file.csv > result.txt
    J'ai mis un paramètre 0077 qui indique à perl de lire le fichier en entrée, car je ne connait pas la signification de 0073. Mais je suis prêt à l'apprendre...

  9. #9
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Salut,
    Je vois que tu as modifié le titre de ton message en ajoutant résolu. Mais pour que nous nous y retrouvions dans la modération, il est préférable d'utiliser le bouton prévu à cet effet en bas de la discussion. Je ne suis plus dans mon jardin de PHP, donc je n'ai pas la possibilité de le faire à ta place.

    Enfin, j'attends ta confirmation de bonne résolution pour envoyer ton fichier de test à Dave Null.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Parfait! Ca marche impeccable.

    Pas la ligne de commande par contre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /Desktop/koha/users$ perl -0077 -pe "s/\n(?!\d{2,4};[A-Z])//mg" utilisateurokutf8 > result.txt
    bash: !\d{2,4}: event not found
    Problème de "", il faut des ' '.

    Le fichier devient visible :-).

    Est ce qu'il ya des livres de PERL sympa qui fait en particulier de la manipulation de chaines. REGEX, lib etc..?

  11. #11
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    En perl, il y a un bouquin incontournable à mon sens : le camel book

    Et pour les regex, il y a aussi une bible : http://general.developpez.com/livres...L9780596528126

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Citation Envoyé par jml94 Voir le message
    En perl, il y a un bouquin incontournable à mon sens : le camel book

    Et pour les regex, il y a aussi une bible : http://general.developpez.com/livres...L9780596528126
    Merci!

  13. #13
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Je viens de détruire le fichier de test et d'effacer le message privé qui le contenait.

    @+


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

Discussions similaires

  1. [RegEx] Regex pour créer fichier CSV
    Par ouarzazate1 dans le forum Langage
    Réponses: 1
    Dernier message: 08/12/2013, 02h51
  2. [regex] Epuration StackTrace pour fichier CSV
    Par BizuR dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2006, 11h57
  3. API ou OCX gratuites pour traitement d'image
    Par uranium-design dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 02/09/2006, 16h03
  4. [RegEx] Regex pour les accents et autres
    Par yule dans le forum Langage
    Réponses: 4
    Dernier message: 21/08/2006, 15h47
  5. Programmation pour traitement de données
    Par benbois dans le forum Langages de programmation
    Réponses: 16
    Dernier message: 19/10/2005, 17h01

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