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 :

Recherche de caractères non ASCII


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 25
    Points
    25
    Par défaut Recherche de caractères non ASCII
    Bonjour.

    Je vais essayer de vous expliquez mon soucis, mais je sent que cela ne va pas être facile

    Avant tout, mon soucis rentre dans le cadre des incompatibilitées Windows / Unix.

    Le contructeur HP ( pour Unix ) nous a fourni une liste héxadécimal de caractère non imprimable.
    Il y a en tout 31 code Héxa :
    81
    82
    83
    84
    85
    86
    87
    88
    89
    8a
    8b
    8c
    8d
    8e
    8f
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    9a
    9b
    9c
    9d
    9e
    9f
    J'ai donc mis ces codes dans un fichier que je charge dans mon script avec un while classique.

    Mon soucis est le suivant : je souhaite savoir si, dans un fichier de donnée externe ( certain font plus de 40000 lignes ) je rencontre un de ces codes non ASCII, sachant que :
    • Le fichier externe est sur Windows et que je doit effectuer ce test avant un transfert sur Unix
    • Le fichier externe est un fichier TXT classique


    Une des solutions a été d'effectuer la comparaison caractère par caractère. Sur un fichier d'une dizaine de ligne, pas de soucis, mais avec un fichier de plus de 40000 lignes, cela dure bien trop longtemps.
    J'ai donc tenté de faire un grep sur l'ensemble de la ligne, mais sans résultat.

    Ma question est donc la suivante : est-il possible de tester si, sur une ligne de donnée, il y a un caractère non ASCII ?

  2. #2
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my @hexCodes = ... ;
    my $str_rx = '[' . (join '', map { chr(hex($_)) } @hexCodes) . ']';
    my $rx = qr/$str_rx/;
     
    while( <$big_infile> ) {
      warn "Unprintable character on line $.\n" if m/$rx/;
    }
    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Tu es un Dieu JEDAI !!

    Je ne comprend pas tout à ton code, mais je teste ça ce matin au boulot et je te dit le résultat.

    Il faut vraiment que je me penche un peu plus sur certaine fonction tel que qr ou map.

    Merci d'avance.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Encore merci JEDAI.
    Ton code fonctionne parfaitement. Du coup, cela me donne cela :
    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
    if ( !-f $Fliste )
       {
         print "\n<b><font color=red>- Le fichier $Fliste est absent. Impossible de faire le test des caracteres non imprimable</b></font>\n";
       }
    else
       {
         # Mémorisation des caractères à rechercher dans un tableau
         print "- Memorisation dans un tableau des caracteres non imprimable sous UNIX\n";
         print "- Lecture du fichier $Fliste\n";
         open (FLISTE, "$Fliste") || die "Impossible de lire le fichier liste $Fliste !\n";
         while (<FLISTE>)
         {
           chomp;
           $listeCar[$i]=$_;
           $i++;
         }
        close (FLISTE);
     
         my $str_rx = '[' . (join '', map { chr(hex($_)) } @listeCar) . ']';
         my $rx = qr/$str_rx/;
     
         print "\n- Liste des caracteres a rechercher dans le fichier $fichier\n";
         open (FFICHIER, "$fichier") || die "Impossible de lire le fichier $fichier !\n";
         while (<FFICHIER>)
           {
             print "Ligne ".$.." , colonne ".$+[0]." : detection du caractere ".$&."\n" if m/$rx/ ;
         }
    }
    L'exploration d'un fichier de plus de 68000 lignes ne durent que quelques secondes. Encore merci.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/10/2008, 12h08
  2. Jeu de caractère non-ascii
    Par nyme92 dans le forum Administration système
    Réponses: 2
    Dernier message: 07/03/2008, 18h39
  3. Réponses: 3
    Dernier message: 08/02/2008, 19h34
  4. Détecter des caractères non-ASCII
    Par gvdmoort dans le forum Ruby
    Réponses: 2
    Dernier message: 27/01/2008, 13h16
  5. [SQL-2005] Rechercher des caractères non numériques
    Par castaka dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/05/2007, 11h12

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