/// <summary> /// Writes a single row to a CSV file. /// </summary> /// <param name="row">The row to be written</param> public void WriteRow(AFCsvRow row) { StringBuilder builder = new StringBuilder(); bool firstColumn = true; foreach (string value in row) { // Add separator if this isn't the first value if (!firstColumn) { builder.Append(','); } // Implement special handling for values that contain comma or quote // Enclose in quotes and double up any double quotes if (value.IndexOfAny(new char[] { '"', ',' }) != -1) { builder.AppendFormat("\"{0}\"", value.Replace("\"", "\"\"")); } else { builder.Append(value); } firstColumn = false; } row.LineText = builder.ToString(); WriteLine(row.LineText); }
/// <summary> /// Reads a row of data from a CSV file /// </summary> /// <param name="row"></param> /// <returns></returns> public bool ReadRow(AFCsvRow row) { //This row will ignore the white spaces and the # while (((row.LineText = ReadLine()) != null)) { if (row.LineText.StartsWith("#") || String.IsNullOrEmpty(row.LineText)) { continue; } else { break; } } if (row.LineText == null) { return(false); } int pos = 0; int rows = 0; while (pos < row.LineText.Length) { string value; // Special handling for quoted field if (row.LineText[pos] == '"') { // Skip initial quote pos++; // Parse quoted value int start = pos; while (pos < row.LineText.Length) { // Test for quote character if (row.LineText[pos] == '"') { // Found one pos++; // If two quotes together, keep one // Otherwise, indicates end of value if (pos >= row.LineText.Length || row.LineText[pos] != '"') { pos--; break; } } pos++; } value = row.LineText.Substring(start, pos - start); value = value.Replace("\"\"", "\""); } else { // Parse unquoted value int start = pos; while (pos < row.LineText.Length && row.LineText[pos] != ';') { pos++; } value = row.LineText.Substring(start, pos - start); } // Add field to list if (rows < row.Count) { row[rows] = value; } else { row.Add(value); } rows++; // Eat up to and including next comma while (pos < row.LineText.Length && row.LineText[pos] != ';') { pos++; } if (pos < row.LineText.Length) { pos++; } } // Delete any unused items while (row.Count > rows) { row.RemoveAt(rows); } // Return true if any columns read return(row.Count > 0); }