FixedWidthImporter.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace InABox.Core
  6. {
  7. public interface IFixedWidthImporter
  8. {
  9. int[] ColumnWidths { get; set; }
  10. }
  11. public class FixedWidthImporter<T> : BaseImporter<T>, IFixedWidthImporter where T : Entity, IRemotable, IPersistent, new()
  12. {
  13. private StreamReader _reader;
  14. public FixedWidthImporter()
  15. {
  16. ColumnWidths = new[] { 1024 };
  17. }
  18. public int[] ColumnWidths { get; set; }
  19. public override bool Open(Stream stream)
  20. {
  21. _reader = new StreamReader(stream);
  22. return true;
  23. }
  24. public override void Close()
  25. {
  26. if (_reader != null)
  27. _reader.Dispose();
  28. _reader = null;
  29. }
  30. public override bool ReadHeader()
  31. {
  32. var result = true;
  33. var fields = new List<string>();
  34. if (HasHeader)
  35. {
  36. for (var i = 1; i < HeaderRow; i++)
  37. {
  38. if (_reader.EndOfStream)
  39. return false;
  40. _reader.ReadLine();
  41. }
  42. if (_reader.EndOfStream)
  43. return false;
  44. var buffer = _reader.ReadLine();
  45. var iOffset = 0;
  46. foreach (var columnwidth in ColumnWidths)
  47. {
  48. var colname = string.Concat(buffer.Skip(iOffset).Take(columnwidth)).Trim();
  49. fields.Add(colname);
  50. iOffset += columnwidth;
  51. }
  52. }
  53. else
  54. {
  55. for (var i = 0; i < ColumnWidths.Length; i++)
  56. fields.Add(string.Format("Column {0}", i + 1));
  57. }
  58. Fields = fields.ToArray();
  59. return true;
  60. }
  61. public override bool MoveNext()
  62. {
  63. return !_reader.EndOfStream;
  64. }
  65. public override Dictionary<string, string> ReadLine()
  66. {
  67. var results = new Dictionary<string, string>();
  68. var fields = new List<string>();
  69. var buffer = _reader.ReadLine();
  70. var iOffset = 0;
  71. foreach (var columnwidth in ColumnWidths)
  72. {
  73. var data = string.Concat(buffer.Skip(iOffset).Take(columnwidth)).Trim();
  74. fields.Add(data);
  75. iOffset += columnwidth;
  76. }
  77. for(int i = 0; i < Fields.Length; ++i)
  78. {
  79. results[Fields[i]] = fields[i];
  80. }
  81. return results;
  82. }
  83. }
  84. }