Mettre un espace après un chiffre

a marqué ce sujet comme résolu.

Bonjour, j’ai plusieurs fichiers avec des noms mais écrits avec une syntaxe différentes, et je veux donc que tous les noms aient la même syntaxe. Pour cela je souhaiterais :

  • Mettre la première lettre en majuscule (j’ai déjà réussi)

  • Dès qu’il y a un chiffre, mettre un espace après le dernier chiffre (si il y en a plusieurs), sauf si celui-ci est suivi d’un point ou virgule

  • Re-mettre une majuscule sur la lettre qui suit l’espace inséré après le chiffre J’ai surtout un problème pour mettre un espace après un chiffre, car il faut que je fasse une boucle "à l’envers" (qui ne marche pas dans mon code suivant) pour ne mettre un espace que après le dernier chiffre si il y a un groupe (par exemple : 12[espace] et non pas 1[espace]2[espace]) mais aussi après un autre groupe de chiffre si il y en a plusieurs dans une même cellule. On m’a conseillé d’utiliser des regex, j’ai donc fait quelques recherches dessus mais je n’arrive pas à les utiliser en app script Voici un

    for (var i = 2 ; i < 60 ; i++) { // Compteur de lignes var vendorName = sheet.getRange(i, 2).getValues() ; // Colonne où sont rangé les noms

       // 1ère lettre en majuscule, le reste en minuscule (réussi)
       var majuscule = vendorName.toString().charAt(0).toUpperCase() + vendorName.toString().substring(1).toLowerCase() ; 
       sheet.getRange(i, 2).setValue(majuscule) ; 
    
       // espace après chiffre
       for (var j = vendorName.length ; j < 1 ; j--) ; // compteur de positionnement dans une cellule 
       {  
            var regExChiffre = new RegExp( "[0-9]" ) ; // prend en compte tous les chiffres
            if ( vendorName.toString().charAt(j) === regexChiffre ) ; { // si en partant de la fin, on trouve un chiffre, 
                 vendorName.toString().charAt(j+1) === " " ; // alors on met un espace après la position  
            }
       }
    

J’ai par exemple : "33Across" —> que je veux transformer en —> "33 Across" ou bien encore "ad6media" —> "Ad6 Media". Par contre, le nom "120, inc" doit rester tel quel, sans espace avant la virgule. Finalement je n’ai pas plusieurs groupe de chiffre dans une même cellule, donc ce point peur être ignoré.

Je n’ai pas testé mais tu peux essayer de faire :

/([^A-z]*)/g -> "$1 "

/([A-z]).*(?: |$)/g -> (a) => {
    return capitalize(a);
}
const capitalize = (s) => {
  if (typeof s !== 'string') return ''
  return s.charAt(0).toUpperCase() + s.slice(1)
}

Donc on résume

  • quand le nom commence par une lettre, elle est mise en majuscule
  • quand une lettre suit (immédiatement) un chiffre, un espace est inséré avant la lettre qui est mise en majuscule

Questions

  1. Les autres lettres, faut il les forcer en minuscules, ou les laisser comme elles sont ? exemple "ABC" devient "Abc" ?

  2. quand tu écris

Dès qu’il y a un chiffre, mettre un espace après le dernier chiffre (si il y en a plusieurs), sauf si celui-ci est suivi d’un point ou virgule

est-ce vrai pour un nom qui se termine par un chiffre, comme "ABC123". Faut-il l’écrire "Abc 123", ou "ABC 123", ou ….

  1. Si il y a des espaces répétés, on en fait quoi ?
+0 -0

Oui il faut forcer à mettre le reste des lettres en minuscule (ABC devient Abc), mais j’ai déjà réalisé ce travail.

Même si le nom se termine par un chiffre, il faut mettre un espace entre la lettre et le chiffre, comme dans ton exemple : "Abc 123". Mais si il y a "ABD,123,abc" il faut remplacer par "Abc 123, Abc"

Si il y a des espaces répétés (c’est à dire plusieurs a la suite ?) il faut supprimer tous ceux qu’il y a en trop pour n’en avoir qu’un seul.

Je n’ai pas testé mais tu peux essayer de faire :

/([^A-z]*)/g -> "$1 "

/([A-z]).*(?: |$)/g -> (a) => {
    return capitalize(a);
}

const capitalize = (s) => { if (typeof s !== 'string’) return '' return s.charAt(0).toUpperCase() + s.slice(1) }

Je te remercie de me consacrer du temps, mais à vrai dire je ne vois pas comment inclure un regex (le tiens ou bien même un autre) dans un code, comme par exemple dans une boucle FOR qui sert de compteur de lignes…

Oui il faut forcer à mettre le reste des lettres en minuscule (ABC devient Abc), mais j’ai déjà réalisé ce travail.

Même si le nom se termine par un chiffre, il faut mettre un espace entre la lettre et le chiffre, comme dans ton exemple : "Abc 123". Mais si il y a "ABD,123,abc" il faut remplacer par "Abc 123, Abc"

Si il y a des espaces répétés (c’est à dire plusieurs a la suite ?) il faut supprimer tous ceux qu’il y a en trop pour n’en avoir qu’un seul.

LeaN

Bon, c’est nouveau l’histoire des virgules. Quand il y aura une spécification absolument complète de ce qu’il faut faire, on pourra envisager de s’y mettre :-)

Je sais pas, mais quand je vois

Mais si il y a "ABD,123,abc" il faut remplacer par "Abc 123, Abc"

j’ai pas l’impression d’avoir lu que, "si il y a plusieurs virgules, on les remplace par un espace sauf pour la dernière qu’on conserve mais en ajoutant un espace quand même"

+0 -0

Excuse moi je n’avais pas vu ma faute, j’ai oublié une virgule. Donc si il y a "ABC,123,abc" il faut bien mettre "Abc, 123, Abc". Aucune virgule n’est à supprimer. (Désolé je n’avais pas vu mon erreur en me relisant)

Hello,

Je ne connais pas trop AppScript mais dans un bon vieux JavaScript qui devrait être compatible :

var str1 = '45   zqdqz4a  22 33across ABC,123,abc 22.2.aedz,dsd';
var transformed = str1
    .replace(/\s{2,}/g, ' ')
    .replace(/(\d+)(?![\d\s.,])/g, '$1 ')
    .split(/\b/)
    .map(function (value) { return capitalize(value) })
    .join('');
// 45 Zqdqz4 A 22 33 Across Abc,123,Abc 22.2.Aedz,Dsd
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte