Question
Un seul caractère en Majuscule (Résolu)
- Thievery
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 11
- Remerciements reçus 0
Tout d'abord merci pour ce site et le livre (que j'ai acheté et que j'ai à côté de moi !). Je débute en PowerShell et je bloque en ce moment sur qqchose qui va certainement vous paraitre tout bête : j'ai une chaine de caractère et je souhaite mettre que certaines lettres en majuscule.
ex : paul --> Paul
J'utilise ToUpper() avec une chaine de caractères mais j'aimerai l'utiliser sur un caractère et cela ne semble pas possible.
J'ai écrit cette fonction :
[code:1]
#
# Fonction Initiales_Majuscule
#
function Initiales_Majuscule($chaine)
{
$maj_chaine = $chaine.ToUpper()
$chaine = [regex]::Replace($chaine, $chaine[0], $maj_chaine[0])
return $chaine
}[/code:1]
Cela fonctionne pour paul (ça me donne bien Paul) mais pour jeje ça me donnera JeJe !
Si vous pouviez me donner un coup de pouce, ce serait chouette
Message édité par: Arnaud, à: 5/12/08 12:04<br><br>Message édité par: Arnaud, à: 9/12/08 23:22
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
Bienvenue dans la communauté PowerShell !
De rien, ça fait plaisir de pouvoir aider...Tout d'abord merci pour ce site et le livre (que j'ai acheté et que j'ai à côté de moi !).
j'ai une chaine de caractère et je souhaite mettre que certaines lettres en majuscule.
ex : paul --> Paul
J'utilise ToUpper() avec une chaine de caractères mais j'aimerai l'utiliser sur un caractère et cela ne semble pas possible.
Effectivement la méthode ToUpper() ne s'utilise que sur une chaine; ça ne fonctionne pas sur un caractère. Il faut donc convertir (\"caster\") le type Char en type String, comme ceci :
[code:1][string]$chaine[0]).ToUpper()[/code:1]
On récupère le premier élément de la chaine, qui est donc un Char et on le force en string avec [String].
Ensuite il ne reste plus qu'à concaténer la chaine avec l'autre morceau restant que l'on obtient en faisant :
[code:1][string]$chaine[1..$chaine.length][/code:1]
Ce qui donne au final :
[code:1]
$chaine = 'arnaud'
([string]$chaine[0]).ToUpper()+[string]$chaine[1..$chaine.length]
[/code:1]
On doit aussi y arriver facilement avec une expression régulière mais ce n'est pas trop ma tasse de thé.
A bientôt,
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Thievery
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 11
- Remerciements reçus 0
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
[code:1]
$chaine = 'arnaud'
([string]$chaine[0]).ToUpper()+[string]$chaine[1..$chaine.length]
Ar n a u d
[/code:1]
Le tableau semble être considéré comme un tableau d'octets et pas comme un tableau de char unicode( 2 octets).
Arnaud écrit:
C'est vrai que ce n'est pas aisé à appréhender, je ne m'y suis mis que récemment, il faut surtout avoir du temps pour s'éxercer.On doit aussi y arriver facilement avec une expression régulière mais ce n'est pas trop ma tasse de thé.
Pour un besoin comme celui-ci c'est assez aisé à rédiger
[code:1]$Chaine -replace \"^.(.*)\", \"$([char]::ToUpper($Chaine[0]))`$1\"[/code:1]
Avec dans les rôles principaux :
^ : début de ligne
$ : fin de ligne
. : un caractère, tous sauf le retour chariot
(): un groupe
* : zéro ou + occurences de l'élement regex précédent
Ce qui nous donne
^. : je prends le premier caractère de la ligne
(.*)$: puis le reste de la ligne, zéro ou n occurences de n'importe quel caractère, que le moteur de regex place dans un groupe nommé $1. (ici il n'y a qu'un seul groupe)
Ce groupe est récupéré dans la variable regex `$1, on doit utiliser l'apostrophe inverse pour éviter que PS ne considére $1 comme une variable, il y a là une \"collision de syntaxe\" en quelque sorte.
Ensuite pour reconstruire la chaine finale, on combine les regex .NET avec les possiblités de PS.
C'est vrai qu'il y a un coté ésotérique dans les regex qui rebute dans les premiers temps; C'est compliqué, bah non mais cela peut le devenir puisque au fur et à mesure on se dit \"tiens je vais le faire avec une regex\" et là c'est le drame
Mais heureusement il y a le plan B !
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Arnaud, sur ton poste cette variable est peut être déjà paramétrée ?
[code:1]
#Premier essai
$Chaine = 'arnaud'
#Récupére un tableau de caractères
$T=[char[]] $Chaine
#Modifie le premier élément
$T[0]=[char]::ToUpper($T[0])
#Mémorise la variable Output Field Separator
$OldOfs=$OFS
$ofs=\"\"
#Renvoi le tableau en tant que chaîne
$Chaine=$T -as [string]
$OFS=$OldOfs
[/code:1]
Ensuite quelques approches :
[code:1]
#Second essai
$Chaine = 'arnaud'
Function Capitalize([String] $Chaine)
{
# Double affectation (ordonnée)
$OldOfs,$OFS=$OFS,\"\"
# Double affectation (ordonnée)
$T,$T[0]=[char[]] $Chaine,[char]::ToUpper($Chaine[0])
#Renvoi le tableau en tant que chaîne
$T -as [string]
$OFS=$OldOfs
}
$Chaine2 = Capitalize $Chaine
#Troisième essai
# On s'affranchi de la manipulation de $OFS
$Chaine = 'arnaud'
Function Capitalize([String] $Chaine)
{
\"{0}{1}\" -F [char]::ToUpper($Chaine[0]),$Chaine.Substring(1,($chaine.length-1)
}
$Chaine2 = Capitalize $Chaine
#La même mais avec un appel de fonction en moins
Function Capitalize([String] $Chaine)
{
[char]::ToUpper($Chaine[0])+$Chaine.Substring(1,($chaine.length-1))
}
$Chaine2 = Capitalize $Chaine
[/code:1]
En dernier on retrouve bien l'appproche d'Arnaud mais basée sur une concaténation de chaines sans passer par un tableau intermédaire qui lui déclenche le comportement de $OFS ($chaine[1..$chaine.length]) et donc faussant le résultat.
Une derniére chose, comme sous .NET les strings sont immuables et bien qu'implémentées via un tableau de caractéres, on ne peut pas affecter une valeur à une string indicée :
[code:1]
$Chaine[0]=[char]::ToUpper($Chaine[0])
[/code:1]
Impossible d'indexer dans un objet de type System.String.
Dommage !<br><br>Message édité par: Laurent Dardenne, à: 5/12/08 19:59
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
Effectivement j'avais positionné [code:1]$OFS=''[/code:1]
J'aurais du l'ajouter dans le code. C'est vrai qu'une fois qu'on a positionné cette variable on a tendance à l'oublier.
Ce qui donne au final :
[code:1]
PS > $OFS=''
PS > $chaine = 'arnaud'
PS > ([string]$chaine[0]).ToUpper()+[string]$chaine[1..$chaine.length]
Arnaud
[/code:1]
Arnaud<br><br>Message édité par: Arnaud, à: 9/12/08 23:20
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Un seul caractère en Majuscule (Résolu)