private IEnumerable<Record> BreakIntoRecords(MessageDefinition definition, StreamReader reader)
{
var currentLine = 1;
var currentRecord = string.Empty;
try
{
var records = new List<Record>();
var recordDefinition = definition.Records[0];
var table = new TableDescriber(recordDefinition.Name, DataSources.NoSource);
var line = reader.ReadLine();
if (definition.HasHeader) line = reader.ReadLine();
string seperator = recordDefinition.FieldSeparator.Length == 1
? string.Format(@"(?<=^(?:[^""]*""[^""]*"")*[^""]*){0}",
recordDefinition.FieldSeparator)
: recordDefinition.FieldSeparator;
Regex seperatorRegex = recordDefinition.FieldSeparator.Length == 1
? new Regex(seperator, RegexOptions.Compiled)
: null;
while (line != null)
{
string[] fields = seperatorRegex != null ? seperatorRegex.Split(line) : line.Split(new[] { recordDefinition.FieldSeparator }, StringSplitOptions.None);
var state = new DictionaryState { IsNew = true };
if (!recordDefinition.Fields.Exists(f => f.Name.Equals("ID", StringComparison.OrdinalIgnoreCase)))
{
state[new ColumnDescriber("ID", table, isIdentity: true)] = Guid.NewGuid();
}
state[new ColumnDescriber("TimeStamp", table, isTimestamp: true)] = null;
foreach (var fieldDefinition in recordDefinition.Fields)
{
currentRecord = fieldDefinition.Name;
ReadRecordField(state, table, fieldDefinition, fields);
}
records.Add(recordDefinition.Create(state));
line = reader.ReadLine();
currentLine++;
currentRecord = string.Empty;
}
return records;
}
catch (FormatException exception)
{
throw new MessagingException(string.Format("Unknown message format. Line {1}, field {2}. {0}", exception.Message, currentLine, currentRecord), exception);
}
}