2013-04-10 16 views
5

Câu hỏi này đã được hỏi trước nhưng tôi đã cố gắng giải pháp trong powershell nhưng không nhận được kết quả mong muốn.Cách tách chuỗi bằng dấu phẩy bỏ dấu phẩy trong dấu ngoặc kép

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

Khi tôi vòng mặc dù các giá trị chia Tôi hy vọng

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

Nhưng am getting

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

Tôi đã thử nghiệm regex sử dụng http://regexhero.net/tester/ (Split) với ExplicitCapture thiết lập và nó sẽ trả về các kết quả mong muốn.

giải pháp làm việc

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

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

Bạn có thể chỉ đơn giản là sử dụng Chỉ cần Thu nhỏ & expload cho rằng ... –

+0

Tôi đoán đó là những tế bào từ một tập tin csv hay như vậy? Tôi muốn đảm bảo có một ký tự không được sử dụng như ';' cho dấu phân cách trong tệp nguồn. – Simon

+0

Không thể chạm vào tệp nguồn. – David

Trả lời

5

[string].split() phương pháp không chấp nhận regex trên chia nhưng chỉ [char[]] hoặc [string[]].

Bạn có thể thử như thế này:

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

PowerShell -split chấp nhận regex cho tách văn bản

Sử dụng .net bạn có thể làm điều đó như thế này:

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

Tôi cũng đã thử -split. Nó thêm vào, như các dòng bổ sung tức là 1, 2 sẽ là 3 mục. Có anyway để loại bỏ các, các mục như cách StringSplitOptions] 'RemoveEmptyEntries' làm việc? – David

+0

@DavidLiddle Bạn đã thử mã của tôi chưa? Tôi đã xóa ảnh chụp trên ',' –

+0

Tôi đã làm việc với [regex] :: Split và RegexOptions.ExplicitCapture. – David