CSV Helper解析器抛出IOException.无法从传输连接读取数据

本文关键字:传输 连接 数据 读取 IOException Helper CSV | 更新日期: 2023-09-27 18:09:11

我在c#项目中使用CSVHelper,并将一个大的csv数据文件(大约2000条记录)读取到内存中。

https://github.com/JoshClose/CsvHelper

如果记录低于500,它会很好地工作,它总是在不同的阶段抛出IOException,这取决于网络或数字是否上升。我目前部署到Azure云平台,所以从blob存储读取到服务器,应该没有任何网络问题。

CsvHelper.CsvParserException: A parsing error occurred.
Row: '995' (1 based)
 ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.IO.StreamReader.ReadBuffer(Char[] userBuffer, Int32 userOffset, Int32 desiredChars, Boolean& readToUserBuffer)
   at System.IO.StreamReader.Read(Char[] buffer, Int32 index, Int32 count)
   at CsvHelper.CsvParser.GetChar(Int32& fieldStartPosition, Int32& rawFieldStartPosition, String& field, Boolean prevCharWasDelimiter, Int32& recordPosition, Int32& fieldLength, Boolean isPeek) in c:'Projects'CsvHelper'src'CsvHelper'CsvParser.cs:line 445
   at CsvHelper.CsvParser.ReadLine() in c:'Projects'CsvHelper'src'CsvHelper'CsvParser.cs:line 247
   at CsvHelper.CsvParser.Read() in c:'Projects'CsvHelper'src'CsvHelper'CsvParser.cs:line 108
   --- End of inner exception stack trace ---
   at CsvHelper.CsvParser.Read() in c:'Projects'CsvHelper'src'CsvHelper'CsvParser.cs:line 136
   at CsvHelper.CsvReader.Read() in c:'Projects'CsvHelper'src'CsvHelper'CsvReader.cs:line 173

抛出while (csv.read())

 var wc = new WebClient();
            using (var sourceStream = wc.OpenRead(fileUrl))
            {
                using (var csv = new CsvReader(new StreamReader(sourceStream)))
                {

                    while (csv.Read())
                    {
                        try
                        {
//some reading operation
}
 catch (Exception ex)
                        {
                            _logger.Error(ex);
                        }
                    }
                    _logger.InfoFormat("Finished {0} reading data #{1}");
                }
            }

任何地方设置流阅读器超时值?

CSV Helper解析器抛出IOException.无法从传输连接读取数据

当使用云资源(无论是Azure还是任何其他云资源)时,您不应该直接读取文件。在最好的情况下,您应该实现重试逻辑,以确保您绕过任何瞬态错误(阅读此处,此处和那里的瞬态错误或只是在互联网上搜索术语"瞬态错误")。

在你的情况下,我建议你围绕CloudBlockBlob包装你的调用。DownloadToStream方法。因此,你仍然可以使用流来解析文件,但你也将在。net Azure Blob API库的安全背后工作,它会代表你处理所有的瞬态错误。

你的代码看起来像这样:

// get the CloudblockBlob object
using(MemoryStream blobStream = new MemoryStream())
{
    blobObject.DownloadToStream(blobStream);
    using (var csv = new CsvReader(new StreamReader(blobStream)))
    {
        while (csv.Read())
        {
            try
            {
             //some reading operation
            }
            catch (Exception ex)
            {
                _logger.Error(ex);
            }
        }
        _logger.InfoFormat("Finished {0} reading data #{1}");
    }
}