/// <summary> /// Extracts a collection of field values from the supplied text record. /// </summary> /// <param name="line">The text record to extract field values from.</param> /// <param name="context">The current parser context.</param> /// <returns>A collection of string values corresponding to the fields in the file definition.</returns> public IEnumerable<string> ReadValues(string line, ParserContext context) { var recordSpec = (FixedRecordSpec)context.RecordSpec; for( int ix = 0; ix < recordSpec.FieldCount; ix++ ) { var fieldSpec = (FixedFieldSpec)recordSpec[ix]; yield return line.Substring(fieldSpec.Start, fieldSpec.Length); } }
internal void Validate(ParserContext context) { if( ! _context.RecordSpec.IsValid(context) ) { throw new InvalidOperationException("Invalid!"); } }
internal void Initialize(ParserContext context) { _context = context; _values.Clear(); }
/// <summary> /// Extracts a collection of field values from the supplied text record. /// </summary> /// <param name="line">The text record to extract field values from.</param> /// <param name="context">The current parser context.</param> /// <returns>A collection of string values corresponding to the fields in the file definition.</returns> public IEnumerable<string> ReadValues(string line, ParserContext context) { _parseStrategy.Reset(); var value = new StringBuilder(line); for( int ix = 0; ix < line.Length; ix++ ) { char current = line[ix]; char? next = ix == line.Length - 1 ? default(char?) : line[ix + 1]; if( _parseStrategy.IncludeChar(current, next) ) { value.Append(current); if( ! _parseStrategy.Escaped && value.EndsWith(_fieldDelimiter) ) { value.Length -= _fieldDelimiter.Length; yield return value.ToString(); value.Length = 0; } } } yield return value.ToString(); }
/// <summary> /// Creates a new record. /// </summary> /// <param name="context">The current parser context</param> /// <returns></returns> public Record CreateRecord(ParserContext context) { _record.Initialize(context); return _record; }
/// <summary> /// Creates a new record. /// </summary> /// <param name="context">The current parser context</param> /// <returns></returns> public Record CreateRecord(ParserContext context) { var record = new Record(); record.Initialize(context); return record; }
private void ParseRecord(ParserContext context) { int ix = 0; foreach (var value in _recordReader.ReadValues(context.LineValue, context)) { context.Current.Add(context.RecordSpec[ix].ConvertText(value)); ix++; } }
private RecordSpec FindRecordSpec(ParserContext context) { return _records.FirstOrDefault(rs => rs.IsMatch(context)); }
/// <summary> /// Parse records from the supplied text reader. /// </summary> /// <param name="reader">The text reader to read records from.</param> /// <returns>A collection records</returns> public IEnumerable<Record> Parse(TextReader reader) { var context = new ParserContext { Parser = this, FirstRecord = true }; var currentLine = ReadLine(reader); var nextLine = ReadLine(reader); while( currentLine != null ) { context.LineValue = currentLine; context.LastRecord = nextLine == null; context.RecordSpec = FindRecordSpec(context); context.Current = _recordFactory.CreateRecord(context); ParseRecord(context); context.Current.Validate(context); yield return context.Current; context.FirstRecord = false; currentLine = nextLine; nextLine = ReadLine(reader); } }