DelimitedImporter.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. if (_parser != null)
  21. _parser.Dispose();
  22. _parser = null;
  23. }
  24. public override bool ReadHeader()
  25. {
  26. var result = true;
  27. for (var i = 1; i < HeaderRow; i++)
  28. {
  29. if (_parser.EndOfData)
  30. return false;
  31. _parser.ReadLine();
  32. }
  33. if (_parser.EndOfData)
  34. return false;
  35. Fields = _parser.ReadLine().Split(','); //.Select(x=>x.Replace(" ","_")).ToArray();
  36. return true;
  37. }
  38. public override bool MoveNext()
  39. {
  40. return !_parser.EndOfData;
  41. }
  42. public override Dictionary<string, string> ReadLine()
  43. {
  44. var results = new Dictionary<string, string>();
  45. var fields = _parser.ReadFields();
  46. foreach (var mapping in Mappings)
  47. if (!string.IsNullOrWhiteSpace(mapping.Field))
  48. {
  49. var iIndex = Array.IndexOf(Fields, mapping.Field);
  50. results[mapping.Property] = fields[iIndex];
  51. }
  52. else
  53. {
  54. results[mapping.Property] = mapping.Constant;
  55. }
  56. return results;
  57. }
  58. }
  59. }