public bool ReadRow(List<string> columns)
{
// Verify required argument
if (columns == null)
throw new ArgumentNullException ("columns");
ReadNextLine:
// Read next line from the file
CurrLine = Reader.ReadLine ();
CurrPos = 0;
// Test for end of file
if (CurrLine == null)
return false;
// Test for empty line
if (CurrLine.Length == 0) {
switch (EmptyLineBehavior) {
case EmptyLineBehavior.NoColumns:
columns.Clear ();
return true;
case EmptyLineBehavior.Ignore:
goto ReadNextLine;
case EmptyLineBehavior.EndOfFile:
return false;
}
}
// Parse line
string column;
int numColumns = 0;
while (true) {
// Read next column
if (CurrPos < CurrLine.Length && CurrLine [CurrPos] == Quote)
column = ReadQuotedColumn ();
else
column = ReadUnquotedColumn ();
// Add column to list
if (numColumns < columns.Count)
columns [numColumns] = column;
else
columns.Add (column);
numColumns++;
// Break if we reached the end of the line
if (CurrLine == null || CurrPos == CurrLine.Length)
break;
// Otherwise skip delimiter
Debug.Assert (CurrLine [CurrPos] == Delimiter);
CurrPos++;
}
// Remove any unused columns from collection
if (numColumns < columns.Count)
columns.RemoveRange (numColumns, columns.Count - numColumns);
// Indicate success
return true;
}