从blob中逐行读取Windows Azure中的存储

有没有办法从Windows Azure中的blob存储中的文本文件逐行读取?

谢谢

Solutions Collecting From Web of "从blob中逐行读取Windows Azure中的存储"

是的,你可以用流来实现,不一定需要你把整个文件拉出来,但是请读到最后(答案…不是文件),因为你可能想把整个文件无论如何。

这里是代码:

StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey( "YourStorageAccountName", "YourStorageAccountKey" ); CloudStorageAccount account = new CloudStorageAccount(credentials, true); CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint.AbsoluteUri, account.Credentials); CloudBlobContainer container = client.GetContainerReference("test"); CloudBlob blob = container.GetBlobReference("CloudBlob.txt"); using (var stream = blob.OpenRead()) { using (StreamReader reader = new StreamReader(stream)) { while (!reader.EndOfStream) { Console.WriteLine(reader.ReadLine()); } } } 

我上传了一个名为CloudBlob.txt的文本文件到一个名为test的容器中。 该文件大小约为1.37 MB(我实际上使用从GitHub的CloudBlob.cs文件复制到相同的文件六七次)。 我尝试了一个BlockBlob,因为你正在谈论一个文本文件,这很可能是你要处理的。

这会像通常一样获取对BLOB的引用,然后从CloudBlob对象中调用OpenRead ()方法,该方法将返回一个BlobStream,然后您可以将其包装在StreamReader中以获取ReadLine方法。 我跑了这个小提琴手,注意到它最后调用了三个额外的块来完成文件。 它看起来像BlobStream有几个属性,这样你可以用来调整阅读量的提前你必须做的,但我没有尝试调整它们。 根据一个参考文献,我发现重试策略在最后一个读取级别也起作用,所以它不会尝试重新读取整个事件,只是最后一个失败的请求。 引用:

最后,DownloadToFile / ByteArray / Stream / Text()方法在单个流获取中执行整个下载。 如果你使用CloudBlob.OpenRead()方法,它将利用BlobReadStream抽象,它将一次下载blob一个块,因为它被消耗。 如果发生连接错误,则只需要重新下载一个块(根据配置的RetryPolicy)。 此外,这可能有助于提高性能,因为客户端可能不需要在本地缓存大量数据。 对于大的blob,这可以帮助很大,但是请注意,您将对服务执行更多的总体交易。 – 乔·贾尔迪诺

我认为重要的是要注意,乔指出,这将导致您的存储帐户的交易总数更大。 但是,根据您的要求,这可能仍然是您正在寻找的选项。

如果这些文件很大,而且你做了很多这样的事情,那么可能会有许多事务(尽管你可以看看你是否可以调整BlobStream的属性来增加一次检索的块的数量等)。 在CloudBlob上执行DownloadFromStream(这将拉低整个内容)仍然有意义,然后按照上面的方法从该流中读取。

唯一真正的区别在于,一次只能拉小块,另一个正在立即拉满。 每个人都有优点和缺点,这将取决于这些文件有多大,如果你打算在阅读文件的过程中停下来(例如“是的,我找到了我正在搜索的字符串!或者如果你打算读整个文件的话,如果你打算把整个文件都拉下来(因为你正在处理整个文件),那么就使用DownloadToStream并把它包装到StreamReader中。

注意:我用1.7 SDK试了一下。 我不确定哪些SDK引入了这些选项。

要直接回答你的问题,你必须编写代码先下载本地块,然后读取其中的内容。 这主要是因为你不能只是闯入一个blob并在中间读取它的内容。 如果您使用过Windows Azure表格存储,那么您确定可以读取表格中的特定内容。

由于您的文本文件是一个blob,位于Azure Blob存储中,您真正需要的是将本地blob(作为本地Blob或内存流)下载到本地,然后读取其中的内容。 你将不得不下载完整或部分取决于你上传了什么类型的blob。 使用Page blobs,您可以在本地下载特定大小的内容并进行处理。 在这方面知道block和page blob之间的区别将是很好的。

这是我用来逐行读取文件的代码。 该文件存储在Azure存储中。 文件服务被使用,而不是blob服务。

 //https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-files //https://<storage account>.file.core.windows.net/<share>/<directory/directories>/<file> public void ReadAzureFile() { CloudStorageAccount account = CloudStorageAccount.Parse( CloudConfigurationManager.GetSetting("StorageConnectionString")); CloudFileClient fileClient = account.CreateCloudFileClient(); CloudFileShare share = fileClient.GetShareReference("jiosongdetails"); if (share.Exists()) { CloudFileDirectory rootDir = share.GetRootDirectoryReference(); CloudFile file = rootDir.GetFileReference("songdetails(1).csv"); if (file.Exists()) { using(var stream = file.OpenRead()) { using(StreamReader reader = new StreamReader(stream)) { while (!reader.EndOfStream) { Console.WriteLine(reader.ReadLine()); } } } } }