从Azure Cloud Blob存储中存储的文件中读取第一行

时间:2017-03-15 09:45:09

标签: azure azure-storage azure-storage-blobs

我尝试读取文件的第一行,该文件存储在Azure存储Blob容器中。下面的代码片段是标准代码,用于读取文件直到结束并写入内容:

 foreach (IListBlobItem item in container.ListBlobs(null, false))
        {
            if (item.GetType() == typeof(CloudBlockBlob))
            {
                CloudBlockBlob blob = (CloudBlockBlob)item;

                using (var stream = blob.OpenRead())
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        while (!reader.EndOfStream)
                        {
                            Console.WriteLine(reader.ReadLine().First());
                            //Console.WriteLine(reader.ReadLine());
                        }
                    }
                }

            }
        }

我想要第一行文件。但我不能使用"而(!reader.EndOfStream)"因为它读取整个文件然后逐行写入控制台。 此外,由于文件大小超过3GB,我无法加载整个文件。

如何仅保存Azure Blob存储中存储的文件的第一行?

3 个答案:

答案 0 :(得分:0)

Azure存储blob与本地文件对象不同。如果要对blob进行特定解析,则需要先将其复制到本地,然后将其作为正确的文件打开。是的,对于3GB文件,考虑到每个blob传输速率为60MB / s,这可能需要一些时间。 (因此,为了达到这些目的,您可能需要考虑将blob的某些部分(例如第一行)存储在辅助的可搜索存储区域中。)

答案 1 :(得分:0)

Azure Blob存储支持读取字节范围。所以你真的不需要下载整个blob来读取文件中的第一行。您想要使用的方法是CloudBlob.DownloadRangeToByteArray

我们假设blob中的行由Line Feed (\n or character code 10)分隔。根据这个假设,您需要做的是:

您可以选择从循环中的第0个字节开始逐步读取单个字节。您将读取的字节存储在某种字节缓冲区中。您将继续阅读,直到遇到此换行符。一旦遇到这种情况,你就会摆脱循环。无论你在缓冲区中拥有什么,都将是你的第一线。

您也可以读取更大的字节范围(例如1024字节或更大),而不是读取单个字节。获得这些字节后,您将在字节范围下载中查找此新行字符。如果找到此字符,则会将数组拆分为此字符的索引,这将是您的第一行。如果您没有遇到此字符,您将把数据提取到某种缓冲区中,然后您将读取下一个1K字节。您将继续执行此操作,直到遇到此新行字符为止。一旦找到它,您将使用缓冲区加上收到的最后一组字节,这将是您的第一行。

答案 2 :(得分:0)

虽然晚了一年,但我没有尝试过,而是使用

while (!reader.EndOfStream)
{
   Console.WriteLine(reader.ReadLine().First());
}
你试过这个吗?

if(!reader.EndOfStream)
{
   Console.WriteLine(reader.ReadLine());
}