using System; using System.Collections.Generic; using System.IO; using TextFieldParserStandard; namespace InABox.Core { public abstract class DelimitedImporter : BaseImporter where T : Entity, IRemotable, IPersistent, new() { private TextFieldParser _parser; protected abstract string Delimiter { get; } public override bool Open(Stream stream) { _parser = new TextFieldParser(stream); _parser.TextFieldType = FieldType.Delimited; _parser.SetDelimiters(Delimiter); return true; } public override void Close() { if (_parser != null) _parser.Dispose(); _parser = null; } public override bool ReadHeader() { var result = true; for (var i = 1; i < HeaderRow; i++) { if (_parser.EndOfData) return false; _parser.ReadLine(); } if (_parser.EndOfData) return false; Fields = _parser.ReadLine().Split(','); //.Select(x=>x.Replace(" ","_")).ToArray(); return true; } public override bool MoveNext() { return !_parser.EndOfData; } public override Dictionary ReadLine() { var results = new Dictionary(); var fields = _parser.ReadFields(); foreach (var mapping in Mappings) if (!string.IsNullOrWhiteSpace(mapping.Field)) { var iIndex = Array.IndexOf(Fields, mapping.Field); results[mapping.Property] = fields[iIndex]; } else { results[mapping.Property] = mapping.Constant; } return results; } } }