C# StreamReader.ReadLine()非常奇怪的行为

C# StreamReader.ReadLine()非常奇怪的行为,c#,stream,C#,Stream,我有一个带有几千行分隔符的文件,我编写了一个自动检测分隔符的方法 方法如下所示: private bool TryDetermineDelimiter(FileInfo target, out char delimiter) { char[] possibleDelimiters = new char[] { ',', ';', '-', ':' }; using (StreamReader sr = new StreamRead

我有一个带有几千行分隔符的文件,我编写了一个自动检测分隔符的方法

方法如下所示:

private bool TryDetermineDelimiter(FileInfo target, out char delimiter)
        {
            char[] possibleDelimiters = new char[] { ',', ';', '-', ':' };

            using (StreamReader sr = new StreamReader(target.OpenRead()))
            {
                List<int> delimiterHits = new List<int>();

                foreach (char del in possibleDelimiters)
                {


                    while (!sr.EndOfStream)
                    {
                        var line = sr.ReadLine();
                        var matches = Regex.Matches(line, $"{del}(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");

                        if(matches.Count == 0)
                        {
                            sr.BaseStream.Seek(0, SeekOrigin.Begin);
                            break;
                        }

                        delimiterHits.Add(matches.Count);
                    }

                    if (delimiterHits.Any(d => d != delimiterHits[0]) || delimiterHits.Count == 0)
                    {
                        delimiterHits.Clear();
                        continue;
                    }

                    delimiter = del;
                    return true;
                }
            }

            delimiter = ',';
            return false;
        }
前4次调用
StreamReader.ReadLine()
返回预期的行,但第5次调用返回:
val13;val14;val15;val16;col1;col2;col3;col4

通过单步执行,我可以确认循环从未进入
如果(matches.Count==0)
块,则每次迭代都会找到正确数量的分隔符

不幸的是,我无法发布实际文件的内容,因为这可能会给我带来麻烦,但我已确保行尾或其他字符没有可疑之处。该文件与预期的一样


我还应该提到,这个错误不会发生在逗号分隔的值上,只会发生在分号上。

将代码更改为

if (matches.Count == 0)
{
    sr.BaseStream.Seek(0, SeekOrigin.Begin);
    sr.DiscardBufferedData();
    break;
}
通过指示
StreamReader
放弃其缓冲区,您就指示它与实际的基本流同步


除此之外,返回的行不是串联的,但它本身是循环的,尽管我上面所展示的内容将在单步执行代码时解决这一问题。。。在
var line=sr.ReadLine()
处,包含第5+1行值的
line
变量是否已连接?很可能在您发布包含反映问题的测试数据集的时,您已经找到了问题的根源。
if (matches.Count == 0)
{
    sr.BaseStream.Seek(0, SeekOrigin.Begin);
    sr.DiscardBufferedData();
    break;
}