DelimitedImporter.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using TextFieldParserStandard;
  5. namespace InABox.Core
  6. {
  7. public abstract class DelimitedImporter<T> : BaseImporter<T> where T : Entity, IRemotable, IPersistent, new()
  8. {
  9. private TextFieldParser _parser;
  10. protected abstract string Delimiter { get; }
  11. public override bool Open(Stream stream)
  12. {
  13. _parser = new TextFieldParser(stream);
  14. _parser.TextFieldType = FieldType.Delimited;
  15. _parser.SetDelimiters(Delimiter);
  16. return true;
  17. }
  18. public override void Close()
  19. {
  20. _parser?.Dispose();
  21. _parser = null;
  22. }
  23. public override bool ReadHeader()
  24. {
  25. for (var i = 1; i < HeaderRow; i++)
  26. {
  27. if (_parser.EndOfData)
  28. return false;
  29. _parser.ReadLine();
  30. }
  31. if (_parser.EndOfData)
  32. return false;
  33. Fields = _parser.ReadLine().Split(','); //.Select(x=>x.Replace(" ","_")).ToArray();
  34. return true;
  35. }
  36. public override bool MoveNext()
  37. {
  38. return !_parser.EndOfData;
  39. }
  40. public override Dictionary<string, string> ReadLine()
  41. {
  42. var results = new Dictionary<string, string>();
  43. var fields = _parser.ReadFields();
  44. for(int i = 0; i < Fields.Length; ++i)
  45. {
  46. results[Fields[i]] = fields[i];
  47. }
  48. return results;
  49. }
  50. }
  51. }