Dzielenie łańcucha na oddzielne zmienne

82

Mam ciąg, który podzieliłem za pomocą kodu $CreateDT.Split(" "). Teraz chcę manipulować dwoma oddzielnymi ciągami na różne sposoby. Jak rozdzielić te dwie zmienne?

davetherave
źródło
Zobacz podobne stackoverflow.com/questions/11348506/…
Michael Freidgeim

Odpowiedzi:

140

Lubię to?

$string = 'FirstPart SecondPart'
$a,$b = $string.split(' ')
$a
$b
mjolinor
źródło
7
Jeśli masz "FirstPart SecondPart ThirdPart"i chcesz tylko dwa, możesz użyć$a,$b = $string.split(' ')[0,1]
Stoinov
Jeśli masz $ string = 'FirstPart - SecondPart' i $ a, $ b = $ string.split ('-'), dodaj ..Trim () ($ a, $ b = $ string.split ('-') .Trim ()), a następnie przycinane są zarówno $ a, jak i $ b
mortenma71
52

Za pomocą -splitoperatora tworzona jest tablica . Tak jak tak

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

Kiedy potrzebujesz określonego elementu, użyj indeksu tablicy, aby go osiągnąć. Pamiętaj, że indeks zaczyna się od zera. Tak jak tak

$arr[2] # 3rd element
and
$arr[4] # 5th element
years
vonPryz
źródło
6
Lub równoważnie:$arr = @($myString.split(' '))
sxc731
2
Może być również linijka jednoliniowa:$first_word = ("one-two-three" -split '-')[0]
information_interchange
2
@ sxc731: .Split()zawsze zwraca tablicę, więc nie ma potrzeby @(...): $arr = $myString.split(' ')Pamiętaj jednak, że im więcej PowerShell-idiomatyczne rozwiązanie $arr = $myString -split ' 'jest już część odpowiedzi. Zwróć jednak uwagę, że -splitprzyjmuje wyrażenie regularne i nie uwzględnia wielkości liter (użyj -csplitdo dzielenia z uwzględnieniem wielkości liter ).
mklement0
25

Należy zwrócić uwagę na następującą różnicę między tymi dwiema technikami:

$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 

Z tego widać, że string.split() metoda :

  • wykonuje podział na wielkość liter (zauważ, że „ALL RIGHT” jego podział na „R”, ale „broken” nie jest dzielony na „r”)
  • traktuje ciąg jako listę możliwych znaków do podziału

Podczas gdy -split operator :

  • wykonuje porównanie bez rozróżniania wielkości liter
  • rozszczepia się tylko na całej strunie
0xG
źródło
4
Są to dobre różnice, na które warto zwrócić uwagę; Innym ważnym jest to, że -splitzajmuje regex (regular expression) jako (pierwszego) RHS argumentu, natomiast [string]Type jest .Split()metoda działa na dosłownym znak / tablicy znaków / i - w .NET Rdzenia - również literalna ciąg . Zwróć również uwagę, że prawidłowa składnia w PowerShell to $Str -split '<BR />'; podczas składni pseudo sposób $Str -Split("<BR />") dzieje się pracę w tym przypadku, należy unikać.
mklement0
9

Spróbuj tego:

$Object = 'FirstPart SecondPart' | ConvertFrom-String -PropertyNames Val1, Val2
$Object.Val1
$Object.Val2
Esperento57
źródło
ConvertFrom-String to lepsze rozwiązanie. Należy zauważyć, że ConvertFrom-String jest w rzeczywistości zaprojektowany z konkretnym zamiarem dzielenia i uprzedmiotawiania ciągów informacji, czego właśnie oczekuje OP. Należy również zauważyć, że chociaż działa polecenie split, potrzeba dodatkowej manipulacji, aby uzyskać to, czego chce OP, coś, czym zajmuje się ConvertFrom-String.
danno
1
@danstermeister: Zasadniczo używanie polecenia cmdlet do prostego dzielenia ciągów jest nieefektywne. W szczególności ConvertFrom-Stringjest przestarzały i należy go unikać (zawsze miał charakter eksperymentalny, a fakt, że nie został uwzględniony w PowerShell Core, gdzie koncentrują się przyszłe wysiłki programistyczne, wskazuje, że nie ma go tutaj, aby zostać). Jeśli chodzi o potrzebę dodatkowej manipulacji: zadanie destrukturyzacji wystarczy:$val1, $val2 = 'FirstPart SecondPart' -split ' '
mklement0
Domyślnie możesz to zrobić: $ Object = 'FirstPart SecondPart' | ConvertFrom-Csv -d '' -H Val1, Val2 (to samo z Core 6);)
Esperento57
1
@ mklement0 - Twórcy PowerShell nie zaimportowali do tej pory wszystkich elementów związanych z systemem Windows ze względu na niezbędną pracę zaplecza, ale spowalniają osiągnięcie tego dla rzeczywistej parzystości funkcji. Więc jeśli nie został specjalnie wycofany w programie Windows PowerShell, nie musiałbym go liczyć. Na przykład, jak sądzę, polecenia netadaptera zostaną przeniesione w najbliższej przyszłości, ale dziś nie istnieją. Sama jego nieobecność obecnie w Core nie jest absolutnie żadnym prognostykiem jego istnienia w Core w przyszłości. A problemy z wydajnością poleceń cmdlet lepiej pozostawić faktycznym programistom, a nie skryptom napędzającym.
danno,
@danstermeister: To prawda, w przypadku braku dalszych informacji nie można wnioskować, że nie zostanie przeniesiony z obecnej nieobecności - tylko, że nie był to priorytet . Jest to punkt sporny, jednak, ponieważ wszystkie ConvertFrom-String„s nieodłącznych problemów to wystarczający powód, aby tego uniknąć. Dotyczy to w szczególności do analizowania opartym na szablonie, ale nawet parsowanie ogranicznik oparte jest wadliwa ze względu na rodzaj wnioskowania , który jest niezmiennie stosowanej - patrz stackoverflow.com/a/50166580/45375 .
mklement0
0

Instrukcja operacji dla obiektu:

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

hi
there
js2010
źródło