using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; namespace Elwig.Helpers.Export { public abstract class Csv : IExporter { public static string FileExtension => "csv"; protected readonly StreamWriter Writer; protected readonly char Separator; protected string? Header; public Csv(string filename, char separator = ';') : this(filename, separator, Encoding.UTF8) { } public Csv(string filename, char separator, Encoding encoding) { Writer = new StreamWriter(filename, false, encoding); Separator = separator; } public void Dispose() { GC.SuppressFinalize(this); Writer.Dispose(); } public ValueTask DisposeAsync() { GC.SuppressFinalize(this); return Writer.DisposeAsync(); } public async Task ExportAsync(IEnumerable data) { if (Header != null) await Writer.WriteLineAsync(Header); foreach (var row in data) { await Writer.WriteLineAsync(FormatRow(row)); } } public void Export(IEnumerable data) { ExportAsync(data).GetAwaiter().GetResult(); } public string FormatRow(IEnumerable row) { return string.Join(Separator, row); } public abstract string FormatRow(T row); } }