/// <summary> /// Construct a new CSV reader off a streamed source /// </summary> /// <param name="source">The stream source. Note that when disposed, the CSV Reader will dispose the stream reader.</param> /// <param name="settings">The CSV settings to use for this reader (Default: CSV)</param> public CSVReader(StreamReader source, CSVSettings settings = null) { _stream = source; _settings = settings; if (_settings == null) { _settings = CSVSettings.CSV; } // Do we need to parse headers? if (_settings.HeaderRowIncluded) { var line = source.ReadLine(); if (_settings.AllowSepLine) { var newDelimiter = CSV.ParseSepLine(line); if (newDelimiter != null) { // We don't want to change the original settings, since they may be a singleton _settings = _settings.CloneWithNewDelimiter(newDelimiter.Value); line = source.ReadLine(); } } Headers = CSV.ParseLine(line, _settings); } else { Headers = _settings.AssumedHeaders; } }
public static void AppendCSVLine <T>(this StringBuilder sb, T obj, CSVSettings settings = null) where T : class, new() #endif { if (settings == null) { settings = CSVSettings.CSV; } // Duplicate settings, but flag ourselves to ignore the header settings = settings.CloneWithNewDelimiter(settings.FieldDelimiter); settings.HeaderRowIncluded = false; var line = Serialize(new T[] { obj }, settings); sb.Append(line); }