Пример #1
0
 /// <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);
     }
 }
Пример #2
0
 internal void Validate(ParserContext context)
 {
     if( ! _context.RecordSpec.IsValid(context) )
     {
         throw new InvalidOperationException("Invalid!");
     }
 }
Пример #3
0
 internal void Initialize(ParserContext context)
 {
     _context = context;
     _values.Clear();
 }
Пример #4
0
        /// <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();
        }
Пример #5
0
 /// <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;
 }
Пример #6
0
 /// <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;
 }
Пример #7
0
 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++;
     }
 }
Пример #8
0
 private RecordSpec FindRecordSpec(ParserContext context)
 {
     return _records.FirstOrDefault(rs => rs.IsMatch(context));
 }
Пример #9
0
        /// <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);
            }
        }