web-dev-qa-db-fra.com

PowerShell divise une chaîne lors de la première occurrence de sous-chaîne/caractère

J'ai une chaîne que je veux diviser en 2 morceaux. Le premier élément est avant la virgule (,) et le deuxième élément contient tout ce qui suit après la virgule (y compris les virgules). 

J'ai déjà réussi à récupérer le premier morceau avant la virgule dans la variable $Header, mais je ne sais pas comment récupérer les morceaux après la première comma dans une grosse chaîne de sorte qu'elle 

$Content = "Text 1,Text 2,Text 3,Text 4," 

Il pourrait y avoir plus de texte alors visible ici, comme par exemple Text 5, Text 6, ..

$String = "Header text,Text 1,Text 2,Text 3,Text 4,"

$Header = $String.Split(',')[0] //<-- $Header = "Header text"
11
DarkLite1

L'opérateur -split de PowerShell prend en charge la spécification du nombre maximal de sous-chaînes à renvoyer, c'est-à-dire combien de sous-chaînes à renvoyer. Après le motif à scinder, donnez le nombre de chaînes que vous voulez récupérer:

$header,$columns = "Header text,Text 1,Text 2,Text 3,Text 4," -split ',',2
17
Aaron Jensen

Essayez quelque chose comme:

$Content=$String.Split([string[]]"$Header,", [StringSplitOptions]"None")[1]

Lorsque vous vous séparez en fonction d'une chaîne, vous utilisez une signature différente de la fonction split.

L'utilisation de base nécessite un seul argument, un caractère séparateur (par exemple, plus d'informations à ce sujet ici ). Cependant, pour utiliser des chaînes, la signature est la suivante:

System.String[] Split(String[] separator, StringSplitOptions options)

C'est pourquoi vous devez convertir votre chaîne en tableau. Nous utilisons l'option None dans ce cas, mais vous pouvez trouver les autres options disponibles dans la documentation split.

Enfin, comme la valeur de $Heasder, est au début de votre $String, vous devez intercepter le deuxième membre du tableau résultant.

3
Aserre

Cette solution alternative exploite la capacité de PowerShell de distribuer des tableaux à plusieurs variables avec une seule affectation. Notez cependant que l'opérateur -split se scinde à chaque virgule et que la conversion intégrée de PowerShell de Array back à String entraîne la concaténation des éléments. Donc, ce n'est pas aussi efficace que String.Split, mais dans votre exemple, c'est négligeable.

$OFS = ','
$Content = 'Header text,Text 1,Text 2,Text 3,Text 4,'

[String]$Header,[String]$Rest = $Content -split $OFS

$OFS = ' '
Write-Host "Header = $Header"
Write-Host "Rest   = $Rest"

Enfin, $OFS est une variable spéciale dans PowerShell qui détermine le caractère à utiliser lors de la réunion des éléments du tableau dans une seule chaîne. Par défaut, c'est un espace. Mais cela peut être changé en n'importe quoi.

0
Josh

la méthode d'Aaron est la meilleure, mais je propose ma solution

$array="Header text,Text 1,Text 2,Text 3,Text 4," -split ','
$array[0],($array[1..($array.Length -1)] -join ",")
0
Esperento57