Exemplo n.º 1
0
        public void AdvanceToEndOfLine()
        {
            while (true)
            {
                char c = buffer.GetNextChar(true);


                if (eos)
                {
                    break;
                }


                if (c == '\x0D') //'\r'
                {
                    stream.LineNbr++;
                    previousWasCr = true;


                    // we are at the end of the line, eat newline characters and exit
                    eol = true;
                    if (c == '\x0D' && buffer.GetNextChar(false) == '\x0A')
                    {
                        // new line sequence is 0D0A
                        buffer.GetNextChar(true);
                    }
                    eol = false;


                    break;
                }
            }
        }
Exemplo n.º 2
0
        public bool GetNextItem(ref string itemString, int?itemLength = null)
        {
            itemString = null;
            if (Eol)
            {
                // previous item was last in line, start new line
                Eol = false;
                return(false);
            }

            var itemFound = false;
            var quoted    = false;
            var predata   = true;
            var postdata  = false;
            var item      = new StringBuilder();

            var cnt = 0;

            while (true)
            {
                if (itemLength != null && cnt >= itemLength.Value)
                {
                    itemString = item.ToString();
                    return(true);
                }

                var c = _buffer.GetNextChar(true);
                cnt++;

                if (Eos)
                {
                    if (itemFound)
                    {
                        itemString = item.ToString();
                    }
                    return(itemFound);
                }

                // Keep track of line number.
                // Note that line breaks can happen within a quoted field, not just at the
                // end of a record.
                // Don't count 0D0A as two line breaks.
                if ((!_previousWasCr) && (c == '\x0A'))
                {
                    _stream.LineNbr++;
                }


                if (c == '\x0D') //'\r'
                {
                    _stream.LineNbr++;
                    _previousWasCr = true;
                }
                else
                {
                    _previousWasCr = false;
                }

                if ((postdata || !quoted) && (itemLength == null && c == _stream.SeparatorChar))
                {
                    if (_stream.IgnoreTrailingSeparatorChar)
                    {
                        var nC = _buffer.GetNextChar(false);
                        if ((nC == '\x0A' || nC == '\x0D'))
                        {
                            continue;
                        }
                    }
                    // end of item, return
                    if (itemFound)
                    {
                        itemString = item.ToString();
                    }
                    return(true);
                }


                if ((predata || postdata || !quoted) && (c == '\x0A' || c == '\x0D'))
                {
                    // we are at the end of the line, eat newline characters and exit
                    Eol = true;
                    if (c == '\x0D' && _buffer.GetNextChar(false) == '\x0A')
                    {
                        // new line sequence is 0D0A
                        _buffer.GetNextChar(true);
                    }


                    if (itemFound)
                    {
                        itemString = item.ToString();
                    }
                    return(true);
                }


                if (predata && c == ' ')
                {
                    // whitespace preceeding data, discard
                    continue;
                }


                if (predata && c == '"')
                {
                    // quoted data is starting
                    quoted    = true;
                    predata   = false;
                    itemFound = true;
                    continue;
                }


                if (predata)
                {
                    // data is starting without quotes
                    predata = false;
                    item.Append(c);
                    itemFound = true;
                    continue;
                }


                if (c == '"' && quoted)
                {
                    if (_buffer.GetNextChar(false) == '"')
                    {
                        // double quotes within quoted string means add a quote
                        item.Append(_buffer.GetNextChar(true));
                    }
                    else
                    {
                        // end-quote reached
                        postdata = true;
                    }

                    continue;
                }


                // all cases covered, character must be data
                item.Append(c);
            }
        }