2013-05-08 11 views
11

Próbuję pluć łańcuch z ogranicznikiem, który jest ciągiem:Jak podzielić ciąg przez ciąg w PowerShell

$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" 
$separator = "<<>>" 
$string.Split($separator) 

W wyniku rozszczepienia uzyskać:

5637144576, messag 

est 



5637145326, 1 



5637145328, 0 

zamiast

5637144576, messag<>est 
5637145326, 1 
5637145328, 0 

Kiedy próbuję użyć przeciążony rozłamu która akceptuje ciąg []:

$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" 
$separator = @("<<>>") 
$string.Split($separator) 

Ale mam kolejny błąd:

Cannot convert argument "0", with value: "System.Object[]", for "Split" to type "System.Char[]": "Cannot convert value "<<>>" to type "System.Char". Error: "String must be exactly one character long."" 

Czy ktoś wie, jak podzielić ciąg przez ciąg?

+0

Dlaczego separator '<<>>' jest podzielony wzdłuż '<>'? –

+0

Dlaczego separator powinien być podzielony wzdłuż <>? - jest to problem, z którym się zetknąłem i próbuję rozwiązać – Ievgen

+0

czy chcesz podzielić na _any znak '' <<>> '? –

Odpowiedz

15

Operator -split wykorzystuje ciąg podzielić, zamiast chararray jak Split():

$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" 
$separator = "<<>>" 
$string -split $separator 

5637144576, messag<>est 
5637145326, 1 
5637145328, 0 

Jeśli chcesz użyć metody Split() sznurkiem, musisz $seperator być stringarray z jednego elementu , a także określ wartość stringsplitoptions. Widać to poprzez sprawdzenie jego definicję:

$string.Split 

OverloadDefinitions                     
-------------------                     
string[] Split(Params char[] separator)                
string[] Split(char[] separator, int count)               
string[] Split(char[] separator, System.StringSplitOptions options)         
string[] Split(char[] separator, int count, System.StringSplitOptions options)      

#This one 
string[] Split(string[] separator, System.StringSplitOptions options)  
string[] Split(string[] separator, int count, System.StringSplitOptions options) 


$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" 
$separator = [string[]]@("<<>>") 
$string.Split($separator, [System.StringSplitOptions]::RemoveEmptyEntries) 

5637144576, messag<>est 
5637145326, 1 
5637145328, 0 

EDIT: Jak @RomanKuzmin wskazał, -split pęka przy użyciu regex-patterns domyślnie. Należy więc uciec przed znakami specjalnymi (np. ., które w regex to "any character"). Można także wymusić simplematch wyłączyć regex dopasowywania jak:

$separator = "<<>>" 
$string -split $separator, 0, "simplematch" 

Czytaj więcej o -splithere.

+0

'est' powinno być zachowane.Wydaje się chcieć podzielić przez dowolny znak '<<>>' (to znaczy wzdłuż '<' and '>') –

+0

sry, nie widział est w próbce wyjścia, którego chciałeś ^^ zobacz zaktualizowaną odpowiedź –

+0

czy wiesz, że można zwrócić tylko nie pusty ciąg znaków? – Ievgen

1

Za pomocą metody Split można użyć operatora split. Tak Twój kod będzie tak:

$string -split '<<>>' 
0

Poniższy powinno być to, czego potrzebujesz:

$string -Split $separator 

ta produkuje:

5637144576, messag<>est 
5637145326, 1 
5637145328, 0 
0

Czasami PowerShell wygląda dokładnie tak samo jak C# i na innych, no wiesz ...

Może być również używany w następujący sposób:

# A dummy text file 
$text = @' 
abc=3135066977,8701416400 

def=8763026853,6433607660 

xyz=3135066977,9878763344 
'@ -split [Environment]::NewLine,[StringSplitOptions]"RemoveEmptyEntries" 

"`nBefore `n------`n" 

$text 

"`nAfter `n-----`n" 

# Do whatever with this 
foreach ($line in $text) 
{ 
    $line.Replace("3135066977","6660985845") 
} 
Powiązane problemy