CSVSplit
Given a line from a CSV-encoded file, split it into fields.
Source
private enum CSVSplitState
{
Normal,
InQuotes,
InQuotesFoundQuote
}
public static IEnumerable<string> CSVSplit ( this string s )
{
CSVSplitState state = CSVSplitState.Normal;
StringBuilder token = new StringBuilder();
foreach ( char c in s )
{
switch ( state )
{
case CSVSplitState.Normal:
if ( c == ',' )
{
yield return token.ToString();
token = new StringBuilder();
}
else if ( c == '"' )
state = CSVSplitState.InQuotes;
else
token.Append ( c );
break;
case CSVSplitState.InQuotes:
if ( c == '"' )
state = CSVSplitState.InQuotesFoundQuote;
else
token.Append( c );
break;
case CSVSplitState.InQuotesFoundQuote:
if ( c == '"' )
{
token.Append( c );
state = CSVSplitState.InQuotes;
}
else
{
state = CSVSplitState.Normal;
goto case CSVSplitState.Normal;
}
break;
}
}
yield return token.ToString();
}
Example
"this,\"that, those\",\"the other\", "embedded\"\"quote\"" =>
string[] {
"this",
"that, those",
"the other",
"embedded\"quote"
}