Tách một chuỗi thành các biến riêng biệt


Câu trả lời:


140

Như thế này?

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

7
Nếu bạn có "FirstPart SecondPart ThirdPart"và chỉ muốn có hai chiếc, bạn có thể sử dụng$a,$b = $string.split(' ')[0,1]
Stoinov

Nếu bạn có $ string = 'FirstPart - SecondPart' và $ a, $ b = $ string.split ('-'), hãy thêm ..Trim () ($ a, $ b = $ string.split ('-') .Trim ()), sau đó cả $ a và $ b đều bị cắt
mortenma71

52

Một mảng được tạo bằng -splittoán tử. Như vậy,

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

Khi bạn cần một mục nào đó, hãy sử dụng chỉ mục mảng để tiếp cận nó. Hãy nhớ rằng chỉ số bắt đầu từ con số không. Như vậy,

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

6
Hoặc tương đương:$arr = @($myString.split(' '))
sxc731

2
Cũng có thể là một người viết lót:$first_word = ("one-two-three" -split '-')[0]
information_interchange

2
@ sxc731: .Split()luôn luôn trả về một mảng, vì vậy không cần cho @(...): $arr = $myString.split(' '), nhưng lưu ý rằng giải pháp hơn PowerShell-ngữ, $arr = $myString -split ' ', đã là một phần của câu trả lời. Tuy nhiên, hãy lưu ý rằng nó -splitregex và không phân biệt chữ hoa chữ thường (sử dụng -csplitđể phân tách phân biệt chữ hoa chữ thường ).
mklement0

25

Điều quan trọng cần lưu ý là sự khác biệt sau đây giữa hai kỹ thuật:

$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 

Từ đó bạn có thể thấy rằng string.split() phương pháp :

  • thực hiện phép phân tách có phân biệt chữ hoa chữ thường (lưu ý rằng "TẤT CẢ QUYỀN" phần tách của anh ấy trên "R" nhưng "bị hỏng" không được tách trên "r")
  • coi chuỗi như một danh sách các ký tự có thể được tách ra

Trong khi -split nhà điều hành :

  • thực hiện so sánh không phân biệt chữ hoa chữ thường
  • chỉ tách trên toàn bộ chuỗi

4
Đây là những điểm khác biệt tốt cần chỉ ra; một điều quan trọng khác là -splitlấy regex (biểu thức chính quy) làm toán hạng RHS (đầu tiên) của nó, trong khi phương thức [string]của kiểu .Split()hoạt động trên một tự đen / mảng ký tự / và - trong .NET Core - cũng là một chuỗi ký tự . Ngoài ra, hãy lưu ý rằng cú pháp thích hợp trong PowerShell là $Str -split '<BR />'; trong khi giả phương pháp cú pháp $Str -Split("<BR />") xảy ra với công việc trong trường hợp này, đó là để thể tránh được.
mklement0

9

Thử cái này:

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

ConvertFrom-String là giải pháp tốt hơn. Cần lưu ý rằng ConvertFrom-String thực sự được thiết kế với mục đích cụ thể là tách và đối tượng hóa các chuỗi thông tin, đây chính là điều OP mong muốn. Cũng cần lưu ý rằng trong khi tập lệnh phân tách hoạt động, nó cần thao tác bổ sung để có được những gì OP mong muốn, điều mà ConvertFrom-String sẽ đảm nhận.
danno

1
@danstermeister: Nói chung, sử dụng lệnh ghép ngắn để tách chuỗi đơn giản là không hiệu quả. Cụ thể, ConvertFrom-Stringnó đã lỗi thời và nên tránh (nó luôn có cảm giác thử nghiệm và thực tế là nó chưa được đưa vào PowerShell Core, nơi các nỗ lực phát triển trong tương lai được tập trung, cho thấy rằng nó không ở đây để tồn tại). Đối với nhu cầu thao tác bổ sung: một nhiệm vụ cơ cấu lại sẽ thực hiện:$val1, $val2 = 'FirstPart SecondPart' -split ' '
mklement0

Theo mặc định, bạn có thể làm điều đó: $ Object = 'FirstPart SecondPart' | ConvertFrom-Csv -d '' -H Val1, Val2 (giống với Core 6);)
Esperento57

1
@ mklement0 - Các nhà phát triển PowerShell đã không nhập tất cả các mục tập trung vào cửa sổ cho đến nay do công việc phụ trợ cần thiết, nhưng đang làm chậm việc đạt được điều đó đối với tính năng tương đương thực tế. Vì vậy, trừ khi nó đặc biệt không được chấp nhận trong windows powershell, tôi sẽ không nhất thiết tính nó ra. Ví dụ: các lệnh netadapter, tôi tin rằng sẽ được chuyển trong tương lai gần, nhưng không tồn tại ngày hôm nay. Sự vắng mặt của nó hiện tại hoàn toàn không có nghĩa là nó sẽ tồn tại trong Core trong tương lai. Và các mối quan tâm về hiệu quả của cmdlet tốt hơn nên để lại cho các nhà phát triển thực tế, chứ không phải người viết kịch bản lái xe.
danno

@danstermeister: Đúng, trong trường hợp không có thêm thông tin, bạn không thể suy luận rằng nó sẽ không được chuyển từ trường hợp vắng mặt hiện tại - chỉ là nó không phải là ưu tiên . Đó là một điểm tranh luận, tuy nhiên, bởi vì tất cả các vấn đề cố hữuConvertFrom-String của là đủ lý do để tránh nó. Điều này đặc biệt áp dụng cho các phân tích cú pháp dựa trên mẫu, nhưng ngay cả những phân tích delimiter dựa trên là thiếu sót, do suy luận kiểu đó là lúc nào cũng áp dụng - xem stackoverflow.com/a/50166580/45375 .
mklement0

0

Câu lệnh hoạt động foreach-object:

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

hi
there
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.