【问题标题】:Skip First Row (CSV Header Row) of HttpResponseMessage Content.ReadAsStream跳过 HttpResponseMessage Content.ReadAsStream 的第一行(CSV 标题行)
【发布时间】:2022-11-15 00:26:24
【问题描述】:

下面是一段较大代码的简化示例。基本上,我正在调用一个或多个 API 端点并下载一个写入 Azure Blob 容器的 CSV 文件。如果有多个文件,则会为每个加载的新 csv 文件附加 blob。

问题是,当我追加目标 blob 时,我最终在整个文件中散布了多个标题行,具体取决于我使用的 CSV 的数量。所有的 CSV 都有相同的标题行,我知道第一行总是有一个换行符。有没有办法读取流,跳过内容直到第一个换行符之后,然后将流复制到 blob?

在我看来这很简单,但我很难找到代码方面的方法。我不想等待整个文件下载,然后在内存中删除标题行,因为其中一些文件可能有几千兆字节。

如果有帮助,我正在使用 .net core v6

using Stream blobStream = await blockBlobClient.OpenWriteAsync(true);
{
    for (int i = 0; i < 3; i++)
    {
        using HttpResponseMessage response = await client.GetAsync(downloadUrls[i], HttpCompletionOption.ResponseHeadersRead);

        Stream sourceStream = response.Content.ReadAsStream();
        sourceStream.CopyTo(blobStream);
    }
}

【问题讨论】:

  • StreamReader 和 StreamWriter

标签: c# csv .net-core dotnet-httpclient streamreader


【解决方案1】:

如果我们可以假设流包含 UTF 8 编码文本,那么您可以执行以下操作:

  1. 针对sourceStream 创建一个streamReader
    var reader = new StreamReader(sourceStream);
    
    1. 读取第一行(假设行以 结尾)
    var header = reader.ReadLine();
    
    1. 将第一行+一个 转换为字节数组
    var headerInBytes = Encoding.UTF8.GetBytes(header + Environment.NewLine);
    
    1. 设置第一行之后的位置
    sourceStream.Position = headerInBytes.Length;
    
    1. 从所需位置复制源流
    sourceStream.CopyTo(blobStream);
    

    此提议的解决方案只是一个示例,您可能需要根据实际的流内容进一步调整它并使其更加健壮。

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 2016-08-30
    • 1970-01-01
    • 2015-01-09
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多