Export: Refactor interfaces and classes
This commit is contained in:
@ -1,4 +1,50 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Elwig.Helpers.Export {
|
||||
public class Csv {
|
||||
public abstract class Csv<T> : IExporter<T> {
|
||||
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<T> data) {
|
||||
if (Header != null) await Writer.WriteLineAsync(Header);
|
||||
foreach (var row in data) {
|
||||
await Writer.WriteLineAsync(FormatRow(row));
|
||||
}
|
||||
}
|
||||
|
||||
public void Export(IEnumerable<T> data) {
|
||||
ExportAsync(data).GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
public string FormatRow(IEnumerable row) {
|
||||
return string.Join(Separator, row);
|
||||
}
|
||||
|
||||
public abstract string FormatRow(T row);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user