Guest User

Untitled

a guest
Jun 18th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. CsvRowReader.Use();
  6.  
  7. var text = "First,LastnJohn,Doen";
  8. var file = NameFile.Parse(text);
  9. foreach (var n in file)
  10. WriteLine($"{n.First} {n.Last}");
  11. }
  12. }
  13.  
  14. public class NameFile : RowFile<NameFile, FullName>
  15. {
  16. protected override IEnumerable<FullName> Read(RowReader reader)
  17. {
  18. while (reader.Read())
  19. yield return new FullName
  20. {
  21. First = reader.Get<string>("First"),
  22. Last = reader.Get<string>("Last")
  23. };
  24. }
  25. }
  26.  
  27. public class FullName
  28. {
  29. public string First { get; set; }
  30. public string Last { get; set; }
  31. }
  32.  
  33. public abstract class RowFile<TFile, TRow> : Enumerable<TRow>
  34. where TFile : RowFile<TFile, TRow>, new()
  35. {
  36. public static readonly TFile Empty = new TFile();
  37.  
  38. public static TFile Parse(string text) =>
  39. Load(new StringReader(text));
  40.  
  41. public static TFile Load(string filePath) =>
  42. Load(File.OpenText(filePath));
  43.  
  44. public static TFile Load(Stream stream) =>
  45. Load(new StreamReader(stream));
  46.  
  47. public static TFile Load(TextReader reader)
  48. {
  49. var file = new TFile();
  50. file.Rows = file.Read(RowReader.Create(reader));
  51. return file;
  52. }
  53.  
  54. public sealed override IEnumerator<TRow> GetEnumerator() =>
  55. Rows.GetEnumerator();
  56.  
  57. protected abstract IEnumerable<TRow> Read(RowReader read);
  58. IEnumerable<TRow> Rows { get; set; } = new TRow[0];
  59. }
  60.  
  61. public abstract class RowReader : IDisposable
  62. {
  63. public static Func<TextReader, RowReader> Create { get; protected set; }
  64. public abstract void Dispose();
  65. public abstract bool Read();
  66. public abstract T Get<T>(string name);
  67. }
  68.  
  69. public abstract class Enumerable<T> : IEnumerable<T>
  70. {
  71. public abstract IEnumerator<T> GetEnumerator();
  72. IEnumerator IEnumerable.GetEnumerator() =>
  73. GetEnumerator();
  74. }
  75.  
  76. public class CsvRowReader : RowReader
  77. {
  78. public static void Use() =>
  79. Create = reader => new CsvRowReader(reader);
  80.  
  81. CsvRowReader(TextReader reader)
  82. {
  83. Reader = new CsvReader(reader);
  84. Reader.Read();
  85. Reader.ReadHeader();
  86. }
  87.  
  88. CsvReader Reader { get; }
  89.  
  90. public override void Dispose() =>
  91. Reader.Dispose();
  92.  
  93. public override bool Read() =>
  94. Reader.Read();
  95.  
  96. public override T Get<T>(string name) =>
  97. Reader.GetField<T>(name);
  98. }
Add Comment
Please, Sign In to add comment