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;
}