2012-02-29 9 views
1

私は、文字列を持っていると私は次のように配列にこの文字列を分割したい:カンマで区切られた文字列を引用符付きの文字列で分割するにはどうすればよいですか?

string stemp = "a,b,c,\"d,e f\",g,h"; 
array[0] = a 
array[1] = b 
array[2] = c 
array[3] = d,e f 
array[4] = g 
array[5] = h 

私はこれは、CSVのように見えるsyntax

string array[] = null; 
array = stemp.split(','); 
+2

あなたは[CSV形式](http://tools.ietf.org/html/rfc4180)について説明しています。 [CSVパーサ](http://stackoverflow.com/search?q=%5Bc%23%5D+csv)を使用してください。 – dtb

答えて

3

はおそらく正しい解決策ですが、あなたはまた、正規表現を使用することができます

var stemp = @"a,b,c,""d,e f"",g,h"; 
var regex = new Regex(@"^(?:""(?<item>[^""]*)""|(?<item>[^,]*))(?:,(?:""(?<item>[^""]*)""|(?<item>[^,]*)))*$"); 
var array = regex 
    .Match(stemp) 
    .Groups["item"] 
    .Captures 
    .Cast<Capture>() 
    .Select(c => c.Value) 
    .ToArray(); 

残念ながら、正規表現をので、ここでは不可解であることを、個々の部品の簡単な説明をしている傾向があります

""(?<item>[^""]*)"" 

これは"d,e f"と一致します。

(?<item>[^,]*) 

これは、両方の式が指定したグループitemに関連する部分をキャプチャabなどにマッチします。

これらの式は、非キャプチャグループを使用して交代構文を使用して結合し、グループ化されている(それらABを呼び出すことができます):

(?:A|B) 

は、この新しい表現Cを呼び出すことができます。

^C(?:,C)*$ 
4

を、次の試してみました - パースするそれほど単純ではありません(エスケープを考慮して)。

名前空間に存在するTextFieldParserクラスのようなCSVパーサーを使用することをお勧めします。

FileHelpersのような多くの選択肢があります。 CSVパーサを使用して

+0

これはcsharp @ Odedに関連しています – Pramod

+0

@Pramod - これは.NETアセンブリであり、_any_.NET言語で使用できます。 – Oded

+3

はい、ネームスペースは 'VisualBasic'ですが、違いはありません。単純にクラスを使用してください。 Microsoftがこの名前空間VisualBasicを呼び出すことが最大の間違いの1つであったと思います。彼らが 'CoolHelpers'と呼ぶならば、人々はこの欠陥のある名前空間の輪の原因を再現するのではなく、それをはるかに使うでしょう。 – Oliver

関連する問題