using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Tango.CSV { public class DynamicCsvFile : IDisposable { private bool _isDisposed; private Stream _stream; private StreamWriter _writer; private bool _disposeStream; private bool _columnsWritten; public List Columns { get; set; } public DynamicCsvFile() { Columns = new List(); } public DynamicCsvFile(Stream stream) : this() { _stream = stream; _writer = new StreamWriter(_stream); } public DynamicCsvFile(String file) : this(new FileStream(file, FileMode.Create)) { _disposeStream = true; } private void WriteColumns() { if (!_columnsWritten) { _columnsWritten = true; _writer.WriteLine(String.Join(",", Columns.Select(x => x.Name))); } } public void Append(params Object[] values) { Append((IEnumerable)values); } public void Append(IEnumerable values, Func modifier = null) { if (modifier != null) { Append((IEnumerable)values, (x) => { return modifier((T)x); }); } else { Append((IEnumerable)values, null); } } public void Append(IEnumerable values, Func modifier = null) { if (!_columnsWritten) { WriteColumns(); } List valuesStr = new List(); foreach (var value in values) { Object finalValue = value; if (modifier != null) { finalValue = modifier(finalValue); } valuesStr.Add(finalValue != null ? finalValue.ToString() : String.Empty); } _writer.WriteLine(String.Join(",", valuesStr)); _writer.Flush(); } public void Dispose() { if (!_isDisposed) { _isDisposed = true; if (_disposeStream) { _writer?.Dispose(); _stream?.Dispose(); } } } } }