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

Débutez Discussion :

Remplacer les caractères spéciaux avec SAS


Sujet :

Débutez

  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 198
    Par défaut Remplacer les caractères spéciaux avec SAS
    Bonjour à tous,


    j'ai un fichier d'1 millions de lignes bourré de caractères spéciaux, j'ai essayé de les remplacer par cette petite fonction mais ça ne marche pas :
    j'ai mis juste mis ces trois caractères spéciaux mais en réalité j'en ai plein.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data nettoyage;
    set matable;
    FirstName2=Translate(FirstName,'é','Ú');
    FirstName2=Translate(FirstName,'é','çš');
    FirstName2=Translate(FirstName,'ç','þ');
     
     
    run;
    après exécution :

    SÚbastien devient Sçšbastien
    Franþoise => Franç oise
    AurÚlie => Aurçšlie


    avez vous une idée de ce qui se passe s'il vous plait?


    je vous remercie.

  2. #2
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    Bonsoir,

    je ne sais pas où tu es allé pêcher ces caractères spéciaux (ils manquent à mon bestiaire pourtant déjà bien fourni... ).

    Concernant tes transformations, tu n'utilise pas la bonne fonction : il faut utiliser TRANWRD et non TRANSLATE, TRANSLATE n'est à utiliser que pour les transformations de caractère sur un "bit" vers un autre sur un "bit" également ce qui ne marche pas dans ton cas...

    Ce qu'il faudrait essayer de trouver c'est quelle est la ou les combinaisons de CHARSET te donnant ce/ces résultats pour pouvoir éventuellement l'/les inverser sachant qu'il semble y avoir de l'UTF8 composé avec un autre charset...

    Dans le cas où il y aurait de l'UTF8 simple seulement par exemple il aurait mieux valu appliquer INPUT(string,$UTF8x2000.) par exemple qu'une succession de tranwrd, c'est à la fois plus simple et plus précis.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data gg; g="Général";
    g1=PUT(g,$UTF8x2000.);
    g2=INPUT(g1,$UTF8x2000.);
    run;
    Obs g g1 g2

    1 Général Général Général



    Pour revenir à ton cas il semble y avoir plusieurs combinaisons de charset, tu ne pourras donc sans doute pas tout redresser à 100%, car avant de transformer il faudra, si c'est le cas, aussi trouver la transformation pertinente qui peut charger d'une observation à l'autre en cas de co existence de transcodage multiples, tu dois alors appliquer une étape "détection de transcodage" suivie de "correction de transcodage".



    Enfin pour revenir à ta première question voici un code qui marchera mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data nettoyage;
    set matable;
    FirstName2=TRANWRD(FirstName,'Ú','é');
    FirstName2=TRANWRD(FirstName2,'çš','é');
    FirstName2=TRANWRD(FirstName2,'þ','ç');
    run;

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 198
    Par défaut
    Merci beaucoup, effectivement ça marche mieux avec TRANWRD, je n'ai qu'à pêcher le maximum de caractères spéciaux et les transformer


    Excellente journée à vous.

  4. #4
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 198
    Par défaut
    re-bonjour


    Je reviens vers vous, mon fichier contient 1 millions de lignes et des dizaines de caractères spéciaux, j'ai changé quelques uns avec votre fonction qui marche très bien, par contre le soucis, je ne peux pas détecter tous mes caractères spéciaux à l'oeil nu, y'a t'il un moyen pour détecter ces parasites?

    voilà ce que j'ai fait mais ça ne marche pas:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data  nettoyage (keep=VR_FirstName flag);
    set matable;
    IF length(FirstName) > NOTDIGIT(FirstName) then flag=1 ; else  flag=0;
    run;

    je me suis dit le NOTDIGIT(FirstName) s'arrête dès que le caractère n'est pas dans 'a........z' et du coup la longueur de la chaine sera plus petite de length(FirstName) donc y'a caractère parasite

    bon j'ai pas d'autres idées.





    je vous remercie.

  5. #5
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    bonjour,

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    data  nettoyage (keep=VR_FirstName flag);
    set matable;
    flag=0;
    DO I=1 TO LENGTH (FirstName);
    C=SUBSTR(FirstName,I,1);
    IF C>='7F'x AND LOWCASE(C) NOT IN ('é','à','è','â','ô','ê','ï','ç') THEN flag++1;
    END;
    run;
    sachant que les problèmes de caractères spéciaux liés aux accentuations et apparentés sont à priori codés dans l'extension du charset ASCII (à partir du code 128 jusqu'à 255 soit >=7F).

  6. #6
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 198
    Par défaut
    super, ça marche

    je vais garder ce bout de programme soigneusement, car dés fichiers avec des caractères parasites j'en ai tous les jours.


    Bonne journée à vous.

  7. #7
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    enfin lire >'7F'x ou ce qui est équivalent >='80'x

    bon courage !

  8. #8
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 198
    Par défaut
    re-bonjour,

    Je reviens encore vers vous, voici mon code :


    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
    * Voici quelques caractères parasites que j'ai pu trouvé et modifié, il faut passer plusieurs fois si nécessaire par cette étape de nettoyage pour en trouver et modifier le maximum ;
     
    /* PRENOM_ORIG*/
     
    data "Z:\tmp\&REPERTOIRE.origine"  ;
    set  "Z:\tmp\&REPERTOIRE.origine" ;
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'Ú','é');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'ë','e');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'Ù','e');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'çš','é');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'é','é');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'è','è');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'¾','è');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'é','è');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'Þ','è');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'þ','ç');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'ç','ç');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'ï','â');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'ó','o');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'Â¥','o');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'¸','o');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'ô','ô');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'¶','ô');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'Ã*','i');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'²','i');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'´','ï');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'ô','ï');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'î','î');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'¯','î');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'É','E');
    PRENOM_ORIG=TRANWRD(PRENOM_ORIG,'¿','m');
    run;
     
    * Une boucle(DO END)qui parcour tous les caractères de la chaine "PRENOM_ORIG" ainsi le champs "flag" sest incrémenté de 1 à chaque fois qu'il rencontre un caractère parasite ;
    data   "Z:\tmp\&REPERTOIRE.origine" ;
    set "Z:\tmp\&REPERTOIRE.origine";
    flag=0;
    DO I=1 TO LENGTH (PRENOM_ORIG);
    C=SUBSTR(PRENOM_ORIG,I,1);
    IF C>='7F'x AND LOWCASE(C) NOT IN ('é','à','è','â','ô','ê','ï','ç','î') THEN flag++1;
    END;
    run;  
     
    data  "Z:\tmp\&REPERTOIRE.parasite"; 
    set  "Z:\tmp\&REPERTOIRE.origine" ;
    if flag ne 0;
    run;
    le programme marche, mais le probème c'est que je dois le refaire pour tous les champs (nom, prénom, adresses, ville....) c'est un peu long, en plus j'ai beaucoup de caractères spéciaux et sur 1 millions de lignes!

    J'aimerais savoir si existe t'il une fonction_sas qui permet de modifier tous les caractères spéciaux d'un coup par les bons caractère, çe se fait en foxpro mais SAS je ne sais pas!!!!

  9. #9
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    Bonjour,

    deux types de réponses possible :

    Soit tu identifie quels sont les raisons des mauvais transcodages, et comme je l'ai dit précédemment (vu qu'il semble y en avoir plusieurs) tu applique 1) une phase de détection de l'encodage suivi d'un 2) redressement ad_hoc :
    Par exemple pour détecter de l'UTF8 il suffit de faire le test LENGTH(String)>LENGTH(INPUT(String),$UTF8x2000) , si ce test est positif alors on a au moins présence d'UTF8 et String=INPUT(String,$UTF8x2000.) doit améliorer les choses.
    Sauf que pour les autres encodages c'est moins simple mais à force de tests adéquat et d'obstination on fini par y arriver plus ou moins.

    Soit tu encapsule ton code de redressement dans au choix : une fonction macro de sorte par exemple à appeler %redresse(String1) ; %redresse(String2); etc... dans ton étape DATA, soit en la créant de toute pièce à l'aide de ton code via la PROC FCMP, mais de toute façon quelque part la phase de détection et de redressement te manquera toujours faute à avoir identifié les raisons du mauvais encodage.

    Enfin si une troisième possibilité, qui n'est pas vraiment une troisième, c'est de ne pas traiter les variables caractères de façon séparée mais en bloc à l'aide d'une variable Texte concatené

    Par exemple Texte=STRIP(String1)!!"£"!!STRIP(String2)!!"£"!!STRIP(String3) etc...

    Et appliquer tes opérations à la variable Texte, une fois nettoyée tu applique des SCAN avec délimiteur "£" pour retrouver le contenu de tes variables. Car l'hypothèse que toutes les variables soient dans le même transcodage pour une même observation est très élevé (voir certain, à toi de voir le processus de production de tes données).


    Par ailleurs voici un lien que tu pourra utiliser à profit si la notion de charset t'es inconnue.

    http://www.miakinen.net/vrac/charset...P437&or=5&pr=0
    et si la notion t'es moins étrangère, celui-ci est plus complet (mais plus technique)
    http://www.eki.ee/letter/


    Ton ou tes fichiers sont manifestement altérés parce qu'ils n'ont pas été importés ou exportés de manière correcte, une "quatrième" méthode peut également consister à contacter tes fournisseurs de données, soit pour connaitre pour chaque fichier la nature de l'encodage utilisé et importer en conséquence "proprement" les fichiers, soit pour leur demander de les produire dans un encodage prédéfini (par exemple l'UTF8 fait très bien le "job" entre plateformes à encodages différents).



    Et puis déjà on devrait commencer par le début, lorsque tu fais une proc contents sur ta table quel est l'encodage indiqué ?

    Par exemple sur mon serveur c'est du "wlatin1 Western (Windows)" selon SAS

    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
     
                Procédure CONTENTS
     
                                                        Nom de la table             WORK.D                           Observations             1
                                                        Type de membre              DATA                             Variables                3
                                                        Moteur                      V9                               Index                    0
                                                        Créée                       jeudi 08 janvier 2015 14 h 02    Longueur d'observation   40
                                                        Dernière modification       jeudi 08 janvier 2015 14 h 02    Observations supprimées  0
                                                        Protection                                                   Compressée               NON
                                                        Type de table                                                Triée                    NON
                                                        Libellé
                                                        Représentation des données  WINDOWS_64
                                                        Codage                      wlatin1  Western (Windows)
     
     
                                                                            Informations dépendantes de la machine/de l'hôte
     
                                                                       Taille de la page                    4096
                                                                       Nombre de pages                      1
                                                                       Première page de données             1
                                                                       Nb max. d'obs. par page              101
                                                                       Obs. sur première page de données    1
                                                                       Nombre de corrections dans la table  0
                                                                       Nom du fichier                       F:\_Tvvvv\d.sas7bdat
                                                                       Version de création                  9.0202M3
                                                                       Hôte de création                     X64_ESRV08
     
     
                                                                            Liste alphabétique des variables et des attributs
     
                                                                                     N    Variable    Type     Long.
     
                                                                                     3    ind         Texte       17
                                                                                     1    x           Num.         8
                                                                                     2    y           Num.         8

  10. #10
    Membre émérite
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    le programme marche, mais le probème c'est que je dois le refaire pour tous les champs (nom, prénom, adresses, ville....) c'est un peu long, en plus j'ai beaucoup de caractères spéciaux et sur 1 millions de lignes!
    Cela est en effet possible avec call execute.
    Voici un exemple:

    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
     
    data test  ;
    input var1 $ var2 $;
    cards;
    Ú Ú
    ë ë
    Ù Ù
    çš çš
    a b
    ;run;
    proc contents DATA=test noprint out=_contents (keep=name) ;
    run ;
     
    %macro tran(var=);
    data test;
    set  test;
    &var=TRANWRD(&var,'Ú','é');
    &var=TRANWRD(&var,'ë','e');
    &var=TRANWRD(&var,'Ù','e');
    &var=TRANWRD(&var,'çš','é');
    run;
    %mend;
     
     
    DATA _null_;
    SET _contents;
     call execute('%nrstr(%tran(var='||strip(name)||'));');
    run;
    Cordialement

  11. #11
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 198
    Par défaut
    merci beaucoup!


    bonne soirée.

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

Discussions similaires

  1. Remplacer les caractères spéciaux dans un prénom(Regex)
    Par sajodia dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 17/05/2011, 17h19
  2. remplacer les caractères spéciaux
    Par DeveloppeurWeb dans le forum VB.NET
    Réponses: 9
    Dernier message: 24/02/2011, 11h51
  3. remplacer les caractéres spéciaux
    Par vanesa dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 13/04/2009, 15h46
  4. remplacer les caractères spéciaux
    Par Invité dans le forum Servlets/JSP
    Réponses: 25
    Dernier message: 05/12/2008, 13h56
  5. Réponses: 3
    Dernier message: 18/02/2008, 14h05

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