我有一个包含产品和价格的文件,我需要写入数据库,但是我正在尝试读取一个文件并且它只读取1000行,并且它说它是文件结尾,尽管文件有超过120000行。看起来读者正在从文档的开头读取一些行,然后从中间读取一些行,然后从文件的末尾读取一些行。即使我不将它们写入数据库并只将它们写入数据库,我也得到了相同的结果。 这是我的代码:
public async Task LoadProductsFromExcel()
{
var file = @"F:\Links\productsToImport.csv";
var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
using (var streamReader = new StreamReader(fileStream))
{
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();
var data = line.Split(new[] { ';' });
var product = new Product() { Name = data[1], Code = data[0]};
context.Products.Add(product);
Console.WriteLine(data[0]+" "+ data[1]);
}
}
await unitOfWork.CompleteAsync();
}
流缓冲区或其他问题是否存在问题?或者我正在读错文件。
答案 0 :(得分:1)
我可以看到一些可能性。
首先,.csv文件可能没有Newline字符分隔所有记录,或者它可能有奇怪的字符搞砸了ReadLine()循环。使用Notepad ++打开文件(并确保显示所有符号)或将其放入十六进制编辑器。
其次,你的代码中有一个可能产生异常的错误 - 可能是这段代码实际上已经进入1000行并且由于在try / catch块中默默捕获的异常而退出更高:
var line = streamReader.ReadLine();
var data = line.Split(new[] { ';' });
var product = new Product() { Name = data[1], Code = data[0]};
context.Products.Add(product);
Console.WriteLine(data[0]+" "+ data[1]);
...如果line = gets读取不包含分号的行,则它将使data = 1元素数组。然后使用Name = data [1]的下一行将生成“过去结束数组”异常。所以另一种可能性是你的源文件有一行没有分号,你有一个抓住它的try / catch块。