Dzielenie łańcucha na oddzielne zmienne


Odpowiedzi:


140

Lubię to?

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

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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.