簡単にcommaでsplitすることで済む場合もありますが、quotingとEscape文字列処理も一緒にやらないといけない場合には少しややこしいですね。
実際に必要だったので作りました。
RegExでMatchのIEnumerableを取る方法も出来そうでしたが、簡単にすべてをTraverseするのが分かりやすいし、Performance的にもよさそうでした。Split()関数にだけ慣れているCoderにはフレッシュな感じであるかも知れませんね。
csharp:SplitCS.cs
public static IEnumerable<string> SplitCSV(string csvString)
{
var sb = new StringBuilder();
bool quoted = false;
bool escaped = false;
foreach (char c in csvString)
{
if (quoted)
{
if (!escaped && c == '\\')
{
escaped = true;
continue;
}
if (escaped)
{
sb.Append(c);
escaped = false;
}
else
{
if (c == '"')
quoted = false;
sb.Append(c);
}
}
else
{
if (c == '"')
{
quoted = true;
sb.Append(c);
}
else if (c == ',')
{
yield return sb.ToString();
sb.Length = 0;
}
else
{
sb.Append(c);
}
}
}
//if (quoted)
// throw new ArgumentException("csvString", "Unterminated quotation mark.");
yield return sb.ToString();
}
}
Coding Inverviewに出してもよさそうと感じました。