2013-04-10 9 views
5

この質問は以前に依頼されましたが、私は解決策をpowershellで解決しようとしましたが、目的の結果が得られません。カンマでカンマを無視してダブルクォートでカンマで区切る方法

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

私はループ分割値けれども、私は

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

を期待していしかし、私は設定ExplicitCaptureでhttp://regexhero.net/tester/(スプリット)を使用して、正規表現をテストして、それを返す

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

を取得しています望ましい結果。

作業溶液

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

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

することはでき単に利用するだけ破を:あなたはこのようにそれを行うことができます.NET

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

PowerShellの-split使用して分割テキスト

ためregexを受け入れます&exploadそのために... –

+0

私はそれらがcsvファイルかそれからの細胞かと思いますか?私はむしろ、ソースファイル内の区切り文字として ';'のような未使用の文字を持つことを確認したいと思います。 – Simon

+0

ソースファイルには触れません。 – David

答えて

5

[string].split()方法は、分割の0​​ちょうど[char[]]または[string[]]を受け付けません。

あなたはこのように試すことができます:

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

私も試してみました。余分な行、すなわち1と2が3つのアイテムとなるため、追加されました。とにかく、これらのエントリを削除するには、どのようにStringSplitOptions 'RemoveEmptyEntries'のようなエントリが働いたのですか? – David

+0

@DavidLiddle自分のコードを試しましたか? '、'のキャプチャを削除しました –

+0

私は[regex] :: SplitとRegexOptions.ExplicitCaptureで作業しています。 – David