下面是一段較大代碼的簡化示例。基本上我呼叫一個或多個 API 端點并下載一個 CSV 檔案,該檔案被寫入 Azure Blob 容器。如果有多個檔案,則會為每個加載的新 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);
}
}
uj5u.com熱心網友回復:
.CopyTo 從流中的當前位置開始復制。因此,您需要做的就是丟棄所有字符,直到您丟棄第一個 CR 或換行符。
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();
if (i != 0)
{
char c;
do { c = (char)sourceStream.ReadByte(); } while (c != '\n');
}
sourceStream.CopyTo(blobStream);
}
}
如果所有檔案始終具有相同大小的標題行,您可以為其長度設定一個常量。這樣你就可以像這樣跳過流到準確的正確位置:
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();
if (i != 0)
sourceStream.Seek(HeaderSizeInBytes, SeekOrigin.Begin);
sourceStream.CopyTo(blobStream);
}
}
這會稍快一些,但缺點是檔案將來無法輕易更改格式。
PS 你可能想要處置 sourceStream。直接或通過將其創建包裝在 using 陳述句中。
uj5u.com熱心網友回復:
如果我們可以假設流包含 UTF 8 編碼的文本,那么您可以執行以下操作:
- 創建一個 streamReader
sourceStream
var reader = new StreamReader(sourceStream);
- 閱讀第一行(假設行以 結尾
\n)
var header = reader.ReadLine();
- 將第一行 a轉換
\n為位元組陣列
var headerInBytes = Encoding.UTF8.GetBytes(header Environment.NewLine);
- 設定第一行之后的位置
sourceStream.Position = headerInBytes.Length;
- 從所需位置復制源流
sourceStream.CopyTo(blobStream);
此提議的解決方案只是一個示例,您可能需要根據實際的流內容進一步調整它并使其更加健壯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534890.html
標籤:C#格式文件.net核心dotnet-httpclient串流阅读器
上一篇:如何將此資料框拆分為多列?
