Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.net读取大文件时,它只读取1000行_C#_Asp.net - Fatal编程技术网

C# 在.net读取大文件时,它只读取1000行

C# 在.net读取大文件时,它只读取1000行,c#,asp.net,C#,Asp.net,我有一个包含产品和价格的文件,我需要将其写入数据库,但我试图读取一个文件,它只读取1000行,它说这是文件的结尾,尽管文件有120000多行。看起来读卡器从文档的开头开始读一些行,然后从中间随机读一些行,然后从文件的结尾读一些行。即使我不将它们写入数据库,只将它们写入数据库,我也得到了相同的结果。 这是我的密码: public async Task LoadProductsFromExcel() { var file = @"F:\Links\productsToImpo

我有一个包含产品和价格的文件,我需要将其写入数据库,但我试图读取一个文件,它只读取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();
    }

流的缓冲区有问题还是其他问题?或者我读错了文件。

我可以看到一些可能性

首先,.csv文件可能没有分隔所有记录的换行符,或者可能有奇怪的字符导致ReadLine()循环出错。用记事本++打开文件(并确保显示所有符号)或将其放入十六进制编辑器

其次,您的代码中有一个bug,可能会生成一个异常-这可能是因为这段代码实际上要输入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=get读取不包含分号的行,它将使data=1元素数组。然后,下一行Name=data[1]将生成一个“超过数组末尾”异常。因此,另一种可能是源文件中有一行没有分号,并且有一个try/catch块正在捕获它。

只需使用
file.ReadLines()
@itsme86,它将把整个内容加载到内存中,使用大文件不一定是个好主意。@DavidG
ReadLines
不会将整个文件读入内存。您能将文件读入记事本++或类似的编辑器吗?我怀疑有一些不可读的字符。只是一个猜测。结果是文件有问题,找到了一些可以阻止循环的符号。现在,我在写入数据库时遇到错误,抛出异常:Microsoft.EntityFrameworkCore.dll中的System.ObjectDisposedException异常:System.Private.CoreLib.dllYou中的System.ObjectDisposedException异常:System.ObjectDisposedException异常:System.Private,您需要针对新问题发布新问题。很高兴您能够解决第一个问题,不过:-)哦,即使这不是导致这个特定问题的原因,我还是强烈建议您修复这个bug。即使你想让代码在CSV中有任何格式错误的行时抛出异常,你至少应该抛出一个解释问题的异常,而不是让它抛出一个无法解释发生了什么的“超过数组末尾”异常。是的,我已经修复了它,修复了另一个问题现在一切正常我设法将数据写入数据库:)