2013-04-10 12 views
5

To pytanie zostało zadane wcześniej, ale próbowałem pracować z rozwiązaniem powershell, ale nie otrzymuję pożądanych rezultatów.Jak podzielić ciąg przez przecinek ignorując przecinek w podwójnych cudzysłowach

$line = '1,2,"N",09/04/13,"P09042013ZSD(1,0)","ZSD"' 
[string[]] $splitColumns = $line.Split('(,)(?=(?:[^"]|"[^"]*")*$)', [StringSplitOptions]'RemoveEmptyEntries') 

Kiedy pętla chociaż wartości dzielonych Oczekuję

1 
2 
"N" 
09/04/13 
"P09042013ZSD(1,0)" 
"ZSD" 

Ale otrzymuję

1 
2 
N 
09/04/13 
P09042013ZSD 
1 
0 
ZSD 

Ja testowałem regex przy użyciu http://regexhero.net/tester/ (Split) z ExplicitCapture ustawiony i zwraca pożądane wyniki.

Roztwór roboczy

$RegexOptions = [System.Text.RegularExpressions.RegexOptions] 
$csvSplit = '(,)(?=(?:[^"]|"[^"]*")*$)' 

$splitColumns = [regex]::Split("StringHere", $csvSplit, $RegexOptions::ExplicitCapture) 
+0

Można po prostu użyć Wystarczy implozji & expload dla tego ... –

+0

Chyba są to komórki z pliku CSV? Wolałbym mieć nieużywany znak, taki jak ';' dla separatora w pliku źródłowym. – Simon

+0

Nie można dotknąć pliku źródłowego. – David

Odpowiedz

5

[string].split() metoda nie akceptuje regex w ułamku Ale [char[]] lub [string[]].

Możesz spróbować tak:

$line -split ',(?=(?:[^"]|"[^"]*")*$)' 

PowerShell -split zaakceptować regex tekstu rozłupywania

Korzystanie .net można zrobić to tak:

[regex]::Split($line , ',(?=(?:[^"]|"[^"]*")*$)') 
+0

Próbowałem również -split. Dodano, ponieważ dodatkowe linie, tj. 1, 2, byłyby 3 pozycjami. Czy istnieje mimo to usunąć te wpisy, takie jak jak działa StringSplitOptions] "RemoveEmptyEntries"? – David

+0

@DavidLiddle Czy wypróbowałeś mój kod? Usunąłem przechwytywanie na ',' –

+0

Mam go pracy z [regex] :: Split i RegexOptions.ExplicitCapture. – David

Powiązane problemy