Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Program
- {
- static void Main(string[] args)
- {
- CsvRowReader.Use();
- var text = "First,LastnJohn,Doen";
- var file = NameFile.Parse(text);
- foreach (var n in file)
- WriteLine($"{n.First} {n.Last}");
- }
- }
- public class NameFile : RowFile<NameFile, FullName>
- {
- protected override IEnumerable<FullName> Read(RowReader reader)
- {
- while (reader.Read())
- yield return new FullName
- {
- First = reader.Get<string>("First"),
- Last = reader.Get<string>("Last")
- };
- }
- }
- public class FullName
- {
- public string First { get; set; }
- public string Last { get; set; }
- }
- public abstract class RowFile<TFile, TRow> : Enumerable<TRow>
- where TFile : RowFile<TFile, TRow>, new()
- {
- public static readonly TFile Empty = new TFile();
- public static TFile Parse(string text) =>
- Load(new StringReader(text));
- public static TFile Load(string filePath) =>
- Load(File.OpenText(filePath));
- public static TFile Load(Stream stream) =>
- Load(new StreamReader(stream));
- public static TFile Load(TextReader reader)
- {
- var file = new TFile();
- file.Rows = file.Read(RowReader.Create(reader));
- return file;
- }
- public sealed override IEnumerator<TRow> GetEnumerator() =>
- Rows.GetEnumerator();
- protected abstract IEnumerable<TRow> Read(RowReader read);
- IEnumerable<TRow> Rows { get; set; } = new TRow[0];
- }
- public abstract class RowReader : IDisposable
- {
- public static Func<TextReader, RowReader> Create { get; protected set; }
- public abstract void Dispose();
- public abstract bool Read();
- public abstract T Get<T>(string name);
- }
- public abstract class Enumerable<T> : IEnumerable<T>
- {
- public abstract IEnumerator<T> GetEnumerator();
- IEnumerator IEnumerable.GetEnumerator() =>
- GetEnumerator();
- }
- public class CsvRowReader : RowReader
- {
- public static void Use() =>
- Create = reader => new CsvRowReader(reader);
- CsvRowReader(TextReader reader)
- {
- Reader = new CsvReader(reader);
- Reader.Read();
- Reader.ReadHeader();
- }
- CsvReader Reader { get; }
- public override void Dispose() =>
- Reader.Dispose();
- public override bool Read() =>
- Reader.Read();
- public override T Get<T>(string name) =>
- Reader.GetField<T>(name);
- }
Add Comment
Please, Sign In to add comment