Dividir una cadena en variables separadas


Respuestas:


140

¿Me gusta esto?

$string = 'FirstPart SecondPart'
$a,$b = $string.split(' ')
$a
$b

7
Si tiene "FirstPart SecondPart ThirdPart"y quiere solo dos, puede usar$a,$b = $string.split(' ')[0,1]
Stoinov

Si tiene $ string = 'FirstPart - SecondPart' y $ a, $ b = $ string.split ('-'), agregue ..Trim () ($ a, $ b = $ string.split ('-') .Trim ()), luego se recortan $ ay $ b
mortenma71

52

Se crea una matriz con el -splitoperador. Al igual que,

$myString="Four score and seven years ago"
$arr = $myString -split ' '
$arr # Print output
Four
score
and
seven
years
ago

Cuando necesite un elemento determinado, use el índice de matriz para alcanzarlo. Tenga en cuenta que el índice comienza desde cero. Al igual que,

$arr[2] # 3rd element
and
$arr[4] # 5th element
years

6
O equivalentemente:$arr = @($myString.split(' '))
sxc731

2
También puede ser de una sola línea:$first_word = ("one-two-three" -split '-')[0]
information_interchange

2
@ sxc731: .Split()siempre devuelve una matriz, por lo que no es necesario @(...):, $arr = $myString.split(' ')pero tenga en cuenta que la solución más idiomática de PowerShell`` $arr = $myString -split ' 'ya es parte de la respuesta. Sin embargo, -splittenga en cuenta que toma una expresión regular y no distingue entre mayúsculas y minúsculas (se usa -csplitpara la división que distingue entre mayúsculas y minúsculas).
mklement0

25

Es importante notar la siguiente diferencia entre las dos técnicas:

$Str="This is the<BR />source string<BR />ALL RIGHT"
$Str.Split("<BR />")
This
is
the
(multiple blank lines)
source
string
(multiple blank lines)
ALL
IGHT
$Str -Split("<BR />")
This is the
source string
ALL RIGHT 

A partir de esto, puede ver que el string.split() método :

  • realiza una división que distingue entre mayúsculas y minúsculas (tenga en cuenta que "TODO A LA DERECHA" su división en la "R" pero "roto" no se divide en la "r")
  • trata la cadena como una lista de posibles caracteres para dividir

Mientras que el -split operador :

  • realiza una comparación que no distingue entre mayúsculas y minúsculas
  • solo se divide en toda la cadena

4
Estas son buenas diferencias para señalar; otro importante es que -splittoma una expresión regular (expresión regular) como su (primer) operando RHS, mientras que el método [string]del tipo .Split()opera en un carácter literal / matriz de caracteres / y, en .NET Core , también una cadena literal . Además, tenga en cuenta que la sintaxis adecuada en PowerShell es $Str -split '<BR />'; mientras sintaxis pseudo-método $Str -Split("<BR />") pasa a trabajo en este caso, es que debe evitarse.
mklement0

9

Prueba esto:

$Object = 'FirstPart SecondPart' | ConvertFrom-String -PropertyNames Val1, Val2
$Object.Val1
$Object.Val2

ConvertFrom-String es la mejor solución. Cabe señalar que ConvertFrom-String en realidad está diseñado con la intención específica de dividir y objetivar cadenas de información, que es exactamente lo que OP desea. También debe tenerse en cuenta que si bien el comando split funciona, se necesita manipulación adicional para obtener lo que OP desea, algo de lo que ConvertFrom-String se encarga.
danno

1
@danstermeister: generalmente, el uso de un cmdlet para dividir cadenas simples es ineficaz. Específicamente, ConvertFrom-Stringes obsoleto y debe evitarse (siempre tuvo una sensación experimental y el hecho de que no se haya incluido en PowerShell Core, donde se centran los esfuerzos de desarrollo futuros, indica que no está aquí para quedarse). En cuanto a la necesidad de manipulación adicional: una tarea de desestructuración servirá:$val1, $val2 = 'FirstPart SecondPart' -split ' '
mklement0

Por defecto puede hacerlo: $ Object = 'FirstPart SecondPart' | ConvertFrom-Csv -d '' -H Val1, Val2 (lo mismo con Core 6);)
Esperento57

1
@ mklement0: los desarrolladores de PowerShell no importaron todos los elementos centrados en Windows hasta ahora debido al trabajo de backend necesario, pero están demorando el logro de eso para la paridad de características real. Entonces, a menos que esté específicamente desaprobado en Windows PowerShell, no necesariamente lo descartaría. Los comandos netadapter, por ejemplo, creo que se transferirán en un futuro cercano, pero no existen hoy. Su mera ausencia actualmente en Core no es absolutamente ningún predictor de su existencia en Core en el futuro. Y es mejor dejar las preocupaciones sobre la eficiencia de los cmdlets en manos de los desarrolladores reales, no de los scripters que pasan por alto.
danno

@danstermeister: Es cierto, en ausencia de más información, no puede inferir que no se transferirá de la ausencia actual, solo que no era una prioridad . Sin embargo, ese es un punto discutible porque todos ConvertFrom-Stringlos problemas inherentes son razón suficiente para evitarlo. Esto se aplica especialmente al análisis basado en plantillas, pero incluso el análisis basado en delimitadores es defectuoso debido a la inferencia de tipo que se aplica invariablemente ; consulte stackoverflow.com/a/50166580/45375 .
mklement0

0

Declaración de operación de foreach-object:

$a,$b = 'hi.there' | foreach split .
$a,$b

hi
there
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.