Пример #1
0
        /// <summary>
        /// Reads until a delimiter or line ending is found.
        /// </summary>
        /// <returns>True if the end of the line was found, otherwise false.</returns>
        protected virtual bool ReadField()
        {
            if (context.C != context.ParserConfiguration.Delimiter[0] && context.C != '\r' && context.C != '\n')
            {
                context.C = fieldReader.GetChar();
            }

            while (true)
            {
                if (context.C == context.ParserConfiguration.Quote && !context.ParserConfiguration.IgnoreQuotes)
                {
                    context.IsFieldBad = true;
                }

                if (context.C == context.ParserConfiguration.Delimiter[0])
                {
                    fieldReader.SetFieldEnd(-1);

                    // End of field.
                    if (ReadDelimiter())
                    {
                        // Set the end of the field to the char before the delimiter.
                        context.RecordBuilder.Add(fieldReader.GetField());
                        return(false);
                    }
                }
                else if (context.C == '\r' || context.C == '\n')
                {
                    // End of line.
                    fieldReader.SetFieldEnd(-1);
                    var offset = ReadLineEnding();
                    fieldReader.SetRawRecordEnd(offset);
                    context.RecordBuilder.Add(fieldReader.GetField());

                    fieldReader.SetFieldStart(offset);

                    return(true);
                }
                else if (context.C == -1)
                {
                    // End of file.
                    fieldReader.SetFieldEnd();
                    context.RecordBuilder.Add(fieldReader.GetField());
                    return(true);
                }

                context.C = fieldReader.GetChar();
            }
        }
Пример #2
0
        /// <summary>
        /// Reads until a delimiter or line ending is found.
        /// </summary>
        /// <returns>True if the end of the line was found, otherwise false.</returns>
        protected virtual bool ReadField()
        {
            if (context.C != context.ParserConfiguration.Delimiter[0] && context.C != '\r' && context.C != '\n')
            {
                if (fieldReader.IsBufferEmpty && !fieldReader.FillBuffer())
                {
                    // End of file.
                    fieldReader.SetFieldEnd();

                    if (context.C == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim)
                    {
                        fieldReader.SetFieldStart();
                    }

                    context.RecordBuilder.Add(fieldReader.GetField());
                    return(true);
                }

                context.C = fieldReader.GetChar();
            }

            var inSpaces = false;

            while (true)
            {
                if (context.C == context.ParserConfiguration.Quote && !context.ParserConfiguration.IgnoreQuotes)
                {
                    context.IsFieldBad = true;
                }

                // Trim end outside of quotes.
                if (!inSpaces && context.C == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim)
                {
                    inSpaces = true;
                    fieldReader.SetFieldEnd(-1);
                    fieldReader.AppendField();
                    fieldReader.SetFieldStart(-1);
                    fieldReader.SetRawRecordStart(-1);
                }
                else if (inSpaces && context.C != ' ')
                {
                    // Hit a non-space char.
                    // Need to determine if it's the end of the field or another char.
                    inSpaces = false;
                    if (context.C == context.ParserConfiguration.Delimiter[0] || context.C == '\r' || context.C == '\n')
                    {
                        fieldReader.SetFieldStart(-1);
                    }
                }

                if (context.C == context.ParserConfiguration.Delimiter[0])
                {
                    fieldReader.SetFieldEnd(-1);

                    // End of field.
                    if (ReadDelimiter())
                    {
                        // Set the end of the field to the char before the delimiter.
                        context.RecordBuilder.Add(fieldReader.GetField());
                        return(false);
                    }
                }
                else if (context.C == '\r' || context.C == '\n')
                {
                    // End of line.
                    fieldReader.SetFieldEnd(-1);
                    var offset = ReadLineEnding();
                    fieldReader.SetRawRecordEnd(offset);
                    context.RecordBuilder.Add(fieldReader.GetField());

                    fieldReader.SetFieldStart(offset);

                    return(true);
                }

                if (fieldReader.IsBufferEmpty && !fieldReader.FillBuffer())
                {
                    // End of file.
                    fieldReader.SetFieldEnd();

                    if (context.C == ' ' && (context.ParserConfiguration.TrimOptions & TrimOptions.Trim) == TrimOptions.Trim)
                    {
                        fieldReader.SetFieldStart();
                    }

                    context.RecordBuilder.Add(fieldReader.GetField());
                    return(true);
                }

                context.C = fieldReader.GetChar();
            }
        }