Aufteilen einer Zeichenfolge in separate Variablen


Antworten:


140

So was?

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

7
Wenn Sie "FirstPart SecondPart ThirdPart"nur zwei haben und wollen, können Sie$a,$b = $string.split(' ')[0,1]
Stoinov

Wenn Sie $ string = 'FirstPart - SecondPart' und $ a, $ b = $ string.split ('-') haben, fügen Sie ..Trim () ($ a, $ b = $ string.split ('-') hinzu. .Trim ()), dann werden sowohl $ a als auch $ b
gekürzt

52

Mit dem -splitOperator wird ein Array erstellt . Wie so,

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

Wenn Sie ein bestimmtes Element benötigen, verwenden Sie den Array-Index, um es zu erreichen. Beachten Sie, dass der Index bei Null beginnt. Wie so,

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

6
Oder gleichwertig:$arr = @($myString.split(' '))
sxc731

2
Kann auch ein Einzeiler sein:$first_word = ("one-two-three" -split '-')[0]
information_interchange

2
@ sxc731: Gibt .Split()immer ein Array zurück, daher ist Folgendes nicht erforderlich @(...): $arr = $myString.split(' ')Beachten Sie jedoch, dass die PowerShell-idiomatischere Lösung $arr = $myString -split ' 'bereits Teil der Antwort ist. Beachten Sie jedoch, dass dies -spliteine Regex ist und die Groß- und Kleinschreibung nicht berücksichtigt wird (Verwendung -csplitfür die Aufteilung zwischen Groß- und Kleinschreibung).
mklement0

25

Es ist wichtig, den folgenden Unterschied zwischen den beiden Techniken zu beachten:

$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 

Daraus können Sie ersehen, dass die string.split() Methode :

  • führt eine Groß- und Kleinschreibung durch (beachten Sie, dass "ALL RIGHT" seine Aufteilung auf das "R", aber "gebrochen" nicht auf das "r" aufgeteilt wird)
  • behandelt die Zeichenfolge als eine Liste möglicher Zeichen, auf die aufgeteilt werden soll

Während der -split Bediener :

  • führt einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung durch
  • teilt nur die gesamte Zeichenfolge

4
Dies sind gute Unterschiede, auf die hingewiesen werden muss. Ein weiterer wichtiger ist , dass -splitein dauert regex (regular expression) als (ersten) RHS - Operanden, während die [string]der Typ - .Split()Verfahren arbeitet auf einem Literal Zeichen / Zeichen - Array / und - in NET - Core - auch eine wörtliche Zeichenfolge . Beachten Sie außerdem, dass die richtige Syntax in PowerShell wie folgt lautet $Str -split '<BR />': während pseudo-Methode Syntax $Str -Split("<BR />") zu geschieht Arbeit in diesem Fall ist es zu vermeiden.
mklement0

9

Versuche dies:

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

ConvertFrom-String ist die bessere Lösung. Es sollte beachtet werden, dass ConvertFrom-String tatsächlich mit der spezifischen Absicht entworfen wurde, Informationszeichenfolgen aufzuteilen und zu objektivieren, was genau das ist, was OP wünscht. Es sollte auch beachtet werden, dass das Split-Commandlet zwar funktioniert, jedoch zusätzliche Manipulationen erforderlich sind, um das zu erhalten, was OP wünscht. ConvertFrom-String kümmert sich darum.
Danno

1
@danstermeister: Im Allgemeinen ist die Verwendung eines Cmdlets für die einfache Aufteilung von Zeichenfolgen ineffizient. Insbesondere ConvertFrom-Stringist es veraltet und sollte vermieden werden (es hatte immer ein experimentelles Gefühl und die Tatsache, dass es nicht in PowerShell Core enthalten ist, wo zukünftige Entwicklungsbemühungen konzentriert sind, zeigt, dass es nicht hier bleibt). Was die Notwendigkeit zusätzlicher Manipulationen $val1, $val2 = 'FirstPart SecondPart' -split ' '
betrifft

Standardmäßig können Sie dies tun: $ Object = 'FirstPart SecondPart' | ConvertFrom-Csv -d '' -H Val1, Val2 (wie bei Core 6);)
Esperento57

1
@ mklement0 - PowerShell-Entwickler haben bisher aufgrund der erforderlichen Backend-Arbeit nicht alle Windows-zentrierten Elemente importiert, verlangsamen dies jedoch für die tatsächliche Feature-Parität. Wenn es in Windows Powershell nicht ausdrücklich veraltet wäre, würde ich es nicht unbedingt auszählen. Ich glaube, dass die Netadapter-Befehle in naher Zukunft portiert werden, aber heute nicht existieren. Die bloße Abwesenheit in Core ist absolut kein Prädiktor für die zukünftige Existenz in Core. Bedenken hinsichtlich der Cmdlet-Effizienz sollten besser den tatsächlichen Entwicklern überlassen werden, nicht den Drive-by-Skriptern.
Danno

@danstermeister: Richtig, da keine weiteren Informationen vorliegen, können Sie nicht schließen, dass diese nicht aus der aktuellen Abwesenheit portiert werden - nur, dass sie keine Priorität hatten . Das ist ein strittiger Punkt, aber da alle ConvertFrom-String‚s inhärenten Probleme Grund genug sind , um es zu vermeiden. Dies gilt insbesondere für die Template-basierte Analyse, sondern auch die Trennzeichen-basierte Analyse fehlerhaft ist, aufgrund Typinferenz , die wird immer angewandt - siehe stackoverflow.com/a/50166580/45375 .
mklement0

0

Foreach-Objekt-Operationsanweisung:

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

hi
there
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.