BI experience

Talend et le nettoyage de données

| 5 Commentaires

Pour nettoyer vos données avec Talend, il est intéressant de créer des routines. Voici un exemple de routine qui permet de nettoyer un String d’accent ou d’autres caractères.

/*************************************************************/

public static String nettoyage(String mot)
{
if (mot!= null)
{
String chaineOK = « azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789 « ;

mot = mot.replaceAll(« [ÀÁÂÃÄÅ]« , « A »);
mot = mot.replace(« Ç », « C »);
mot = mot.replaceAll(« [ÈÉÊË]« , « E »);
mot = mot.replaceAll(« [ÌÍÎÏ]« , « I »);
mot = mot.replaceAll(« [ÒÓÔÕÖ]« , « O »);
mot = mot.replaceAll(« [ÙÚÛÜ]« , « U »);
mot = mot.replace(« Ý », « Y »);
mot = mot.replaceAll(« [àáâãäå]« , « a »);
mot = mot.replace(« ç », « c »);
mot = mot.replaceAll(« [èéêë]« , « e »);
mot = mot.replaceAll(« [ìíîï]« , « i »);
mot = mot.replaceAll(« [ðòóôõö]« , « o »);
mot = mot.replaceAll(« [ùúûü]« , « u »);
mot = mot.replaceAll(« [ýÿ]« , « y »);
//mot = mot.replaceAll(« [/_/'/-//]« , « KKKK »);
mot = mot.replaceAll(« [_'-/]« ,  » « );
for (int i=0; i<mot.length(); i++)
{
boolean trouve = true;
for (int j=0; j<chaineOK.length(); j++)
{
if (mot.charAt(i) == chaineOK.charAt(j))trouve = false;
}
if (trouve) mot = mot.replace(mot.charAt(i), ‘_’);
}

}
return mot;
}

/********************************************/

Après dans votre tMap ou encore dans les composants tels que tJava, tJavaFlex…vous pourrez appeler vos routines via :

(routines_nettoyage.nettoyage(row1.monchamp.trim())) ou (leFichierOuSeTrouveMesRoutines.leNomdeMaFonction(row1.monchamp.trim()))

J’espère que ça vous aidera!

5 Commentaires

  1. Pour nettoyer les accents je vous propose une autre implémentation très largement inspiré par un utilisateur de http://www.developpez.com (http://java.developpez.com/sources/?page=nombresDatesString#supprimmerAccents)

    Voici les performances que j’obtient:

    Nombre total d’opérations effectuées par test:1000000
    sansAccent()=3039 ms
    chaine origine : ÀÁÂÃÄÅàáâãäåèéêëÈÉÊËÒÓÔÕÖòóôõöÙÚÛÜùúûüìíîïÎÏñç
    chaine sans accents : AAAAAAaaaaaaeeeeEEEEOOOOOoooooUUUUuuuuiiiiIInc

    nettoyage()=45105 ms
    chaine origine : ÀÁÂÃÄÅàáâãäåèéêëÈÉÊËÒÓÔÕÖòóôõöÙÚÛÜùúûüìíîïÎÏñç
    chaine sans accents : AAAAAAaaaaaaeeeeEEEEOOOOOoooooUUUUuuuuiiiiII_c

    Et le code très légèrement retouché:

    /**************************************************************/

    import java.util.ArrayList;

    public abstract class StringOperation {

    /** Index du 1er caractere accentué * */
    private static final int MIN = 192;

    /** Index du dernier caractere accentué * */
    private static final int MAX = 255;

    /** Vecteur de correspondance entre accent / sans accent * */
    private static final String[] map = initMap();

    /**
    * Initialisation du tableau de correspondance entre les caractéres accentués et leur homologues non accentués
    */
    @SuppressWarnings(« unchecked »)
    private static String[] initMap() {
    ArrayList list = new ArrayList();
    java.lang.String car = null;

    car = « A »;
    list.add(car); /* ‘\u00C0′ À alt-0192 */
    list.add(car); /* ‘\u00C1′ Á alt-0193 */
    list.add(car); /* ‘\u00C2′ Â alt-0194 */
    list.add(car); /* ‘\u00C3′ Ã alt-0195 */
    list.add(car); /* ‘\u00C4′ Ä alt-0196 */
    list.add(car); /* ‘\u00C5′ Å alt-0197 */
    car = « AE »;
    list.add(car); /* ‘\u00C6′ Æ alt-0198 */
    car = « C »;
    list.add(car); /* ‘\u00C7′ Ç alt-0199 */
    car = « E »;
    list.add(car); /* ‘\u00C8′ È alt-0200 */
    list.add(car); /* ‘\u00C9′ É alt-0201 */
    list.add(car); /* ‘\u00CA’ Ê alt-0202 */
    list.add(car); /* ‘\u00CB’ Ë alt-0203 */
    car = « I »;
    list.add(car); /* ‘\u00CC’ Ì alt-0204 */
    list.add(car); /* ‘\u00CD’ Í alt-0205 */
    list.add(car); /* ‘\u00CE’ Î alt-0206 */
    list.add(car); /* ‘\u00CF’ Ï alt-0207 */
    car = « D »;
    list.add(car); /* ‘\u00D0′ Ð alt-0208 */
    car = « N »;
    list.add(car); /* ‘\u00D1′ Ñ alt-0209 */
    car = « O »;
    list.add(car); /* ‘\u00D2′ Ò alt-0210 */
    list.add(car); /* ‘\u00D3′ Ó alt-0211 */
    list.add(car); /* ‘\u00D4′ Ô alt-0212 */
    list.add(car); /* ‘\u00D5′ Õ alt-0213 */
    list.add(car); /* ‘\u00D6′ Ö alt-0214 */
    car = « * »;
    list.add(car); /* ‘\u00D7′ × alt-0215 */
    car = « 0″;
    list.add(car); /* ‘\u00D8′ Ø alt-0216 */
    car = « U »;
    list.add(car); /* ‘\u00D9′ Ù alt-0217 */
    list.add(car); /* ‘\u00DA’ Ú alt-0218 */
    list.add(car); /* ‘\u00DB’ Û alt-0219 */
    list.add(car); /* ‘\u00DC’ Ü alt-0220 */
    car = « Y »;
    list.add(car); /* ‘\u00DD’ Ý alt-0221 */
    car = « Þ »;
    list.add(car); /* ‘\u00DE’ Þ alt-0222 */
    car = « B »;
    list.add(car); /* ‘\u00DF’ ß alt-0223 */
    car = « a »;
    list.add(car); /* ‘\u00E0′ à alt-0224 */
    list.add(car); /* ‘\u00E1′ á alt-0225 */
    list.add(car); /* ‘\u00E2′ â alt-0226 */
    list.add(car); /* ‘\u00E3′ ã alt-0227 */
    list.add(car); /* ‘\u00E4′ ä alt-0228 */
    list.add(car); /* ‘\u00E5′ å alt-0229 */
    car = « ae »;
    list.add(car); /* ‘\u00E6′ æ alt-0230 */
    car = « c »;
    list.add(car); /* ‘\u00E7′ ç alt-0231 */
    car = « e »;
    list.add(car); /* ‘\u00E8′ è alt-0232 */
    list.add(car); /* ‘\u00E9′ é alt-0233 */
    list.add(car); /* ‘\u00EA’ ê alt-0234 */
    list.add(car); /* ‘\u00EB’ ë alt-0235 */
    car = « i »;
    list.add(car); /* ‘\u00EC’ ì alt-0236 */
    list.add(car); /* ‘\u00ED’ í alt-0237 */
    list.add(car); /* ‘\u00EE’ î alt-0238 */
    list.add(car); /* ‘\u00EF’ ï alt-0239 */
    car = « d »;
    list.add(car); /* ‘\u00F0′ ð alt-0240 */
    car = « n »;
    list.add(car); /* ‘\u00F1′ ñ alt-0241 */
    car = « o »;
    list.add(car); /* ‘\u00F2′ ò alt-0242 */
    list.add(car); /* ‘\u00F3′ ó alt-0243 */
    list.add(car); /* ‘\u00F4′ ô alt-0244 */
    list.add(car); /* ‘\u00F5′ õ alt-0245 */
    list.add(car); /* ‘\u00F6′ ö alt-0246 */
    car = « / »;
    list.add(car); /* ‘\u00F7′ ÷ alt-0247 */
    car = « 0″;
    list.add(car); /* ‘\u00F8′ ø alt-0248 */
    car = « u »;
    list.add(car); /* ‘\u00F9′ ù alt-0249 */
    list.add(car); /* ‘\u00FA’ ú alt-0250 */
    list.add(car); /* ‘\u00FB’ û alt-0251 */
    list.add(car); /* ‘\u00FC’ ü alt-0252 */
    car = « y »;
    list.add(car); /* ‘\u00FD’ ý alt-0253 */
    car = « þ »;
    list.add(car); /* ‘\u00FE’ þ alt-0254 */
    car = « y »;
    list.add(car); /* ‘\u00FF’ ÿ alt-0255 */
    list.add(car); /* ‘\u00FF’ alt-0255 */

    return (String[]) list.toArray(new String[0]);
    }

    /**
    * Transforme une chaine pouvant contenir des accents dans une version sans accent
    *
    * @param chaine Chaine a convertir sans accent
    * @return Chaine dont les accents ont été supprimé
    */
    public static java.lang.String sansAccent(java.lang.String chaine) {
    java.lang.StringBuilder sb = new StringBuilder(chaine);

    for (int bcl = 0; bcl = MIN && carVal <= MAX) { // Remplacement
    java.lang.String newVal = map[carVal - MIN];
    sb.replace(bcl, bcl + 1, newVal);
    }
    }
    return sb.toString();
    }

    public static void main(String[] args) {
    String chaine = « ÀÁÂÃÄÅàáâãäåèéêëÈÉÊËÒÓÔÕÖòóôõöÙÚÛÜùúûüìíîïÎÏñç »;

    int loop = 1000000;

    System.out.println(« Nombre total d’opérations effectuées par test: » + loop);

    long time1 = System.currentTimeMillis();
    String chaine2 = «  »;
    for (int i = 0; i < loop; i++) {
    chaine2 = StringOperation.sansAccent(chaine);
    }
    long time2 = System.currentTimeMillis();

    System.out.println(« sansAccent()= » + (time2 – time1) +  » ms »);
    System.out.println(« chaine origine :  » + chaine);
    System.out.println(« chaine sans accents :  » + chaine2);

    time1 = System.currentTimeMillis();
    for (int i = 0; i < loop; i++) {
    chaine2 = StringOperation.nettoyage(chaine);
    }
    chaine2 = StringOperation.nettoyage(chaine);
    time2 = System.currentTimeMillis();

    System.out.println();
    System.out.println(« nettoyage()= » + (time2 – time1) +  » ms »);
    System.out.println(« chaine origine :  » + chaine);
    System.out.println(« chaine sans accents :  » + chaine2);

    // System.out.println(« chaine origine :  » + chaine);
    // System.out.println(« chaine sans accents :  » + chaine2);
    }

    public static String nettoyage(String mot) {
    if (mot != null) {
    String chaineOK = « azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789 « ;

    mot = mot.replaceAll(« [ÀÁÂÃÄÅ]« , « A »);
    mot = mot.replace(« Ç », « C »);
    mot = mot.replaceAll(« [ÈÉÊË]« , « E »);
    mot = mot.replaceAll(« [ÌÍÎÏ]« , « I »);
    mot = mot.replaceAll(« [ÒÓÔÕÖ]« , « O »);
    mot = mot.replaceAll(« [ÙÚÛÜ]« , « U »);
    mot = mot.replace(« Ý », « Y »);
    mot = mot.replaceAll(« [àáâãäå]« , « a »);
    mot = mot.replace(« ç », « c »);
    mot = mot.replaceAll(« [èéêë]« , « e »);
    mot = mot.replaceAll(« [ìíîï]« , « i »);
    mot = mot.replaceAll(« [ðòóôõö]« , « o »);
    mot = mot.replaceAll(« [ùúûü]« , « u »);
    mot = mot.replaceAll(« [ýÿ]« , « y »);
    // mot = mot.replaceAll(« [/_/'/-//]« , « KKKK »);
    mot = mot.replaceAll(« [_'-/]« ,  » « );
    for (int i = 0; i < mot.length(); i++) {
    boolean trouve = true;
    for (int j = 0; j < chaineOK.length(); j++) {
    if (mot.charAt(i) == chaineOK.charAt(j))
    trouve = false;
    }
    if (trouve)
    mot = mot.replace(mot.charAt(i), ‘_’);
    }

    }
    return mot;
    }

    }

    /******************************************************/

  2. Merci je pense que ça va réellement en aider plus d’un dans son processus decisionnel

  3. Impeccable : Plug & play

    Merci pour ce partage

    yann

  4. Bonjour,
    Désolé de réveiller un vieux post, mais ayant été confronté au même pb, j’ai cherché un peu et dans Talend Open Studio for Data Integration, il existe la routine TalendString.removeAccents(String s)

    ex : TalendString.removeAccents(« ÀÁÂÃÄÅàáâãäåèéêëÈÉÊËÒÓÔÕÖòóôõöÙÚÛÜùúûüìíîïÎÏñç »);
    Renvoi la chaîne : « AAAAAAaaaaaaeeeeEEEEOOOOOoooooUUUUuuuuiiiiIInc ».

  5. C’est avec plaisir que tu réveilles ce vieux post. Toute connaissance est bonne à partager.
    Merci à toi!

Laisser un commentaire

Champs Requis *.

*