Question Un seul caractère en Majuscule (Résolu)

Plus d'informations
il y a 17 ans 3 mois #3398 par Thievery
Bonjour,

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.

Plus d'informations
il y a 17 ans 3 mois #3399 par Arnaud Petitjean
Bonjour Thievery,

Bienvenue dans la communauté PowerShell !

Tout d'abord merci pour ce site et le livre (que j'ai acheté et que j'ai à côté de moi !).

De rien, ça fait plaisir de pouvoir aider... ;-) J'espère que tu seras satisfait de notre livre.

j'ai une chaine de caractère et je souhaite mettre que certaines lettres en majuscule.

ex : paul --&gt; 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 (\&quot;caster\&quot;) 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.

Plus d'informations
il y a 17 ans 3 mois #3401 par Thievery
Réponse de Thievery sur le sujet Re:un seul caractère en Majuscule
je n'y avais pas pensé, merci beaucoup je vais pouvoir continuer mon script ;)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3402 par Laurent Dardenne
Arnaud sous la V2 il y a un soucis avec ce code :
[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:

On doit aussi y arriver facilement avec une expression régulière mais ce n'est pas trop ma tasse de thé.

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.
Pour un besoin comme celui-ci c'est assez aisé à rédiger
[code:1]$Chaine -replace \&quot;^.(.*)\&quot;, \&quot;$([char]::ToUpper($Chaine[0]))`$1\&quot;[/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 \&quot;collision de syntaxe\&quot; 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 \&quot;tiens je vais le faire avec une regex\&quot; et là c'est le drame :lol:
Mais heureusement il y a le plan B !

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3408 par Laurent Dardenne
Je viens tester sous la V1 fr. Le problème provient d'un petit piége de PowerShell, après une recherche , ce comportement est du au séparateur de champs $OFS, fallait le trouver celui là !
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=\&quot;\&quot;
#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,\&quot;\&quot;
# 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)
{
\&quot;{0}{1}\&quot; -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.

Plus d'informations
il y a 17 ans 3 mois #3428 par Arnaud Petitjean
Salut,

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 &gt; $OFS=''
PS &gt; $chaine = 'arnaud'
PS &gt; ([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.

Temps de génération de la page : 0.073 secondes
Propulsé par Kunena