将CSV数据直接写入Azure Blob存储

时间:2019-02-05 19:10:13

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

我有一个大约有100万个数据对象的大型阵列。我发现了许多将文件上传到Azure Blob存储的示例。我想您可以使用内存流来做到这一点,但是我还没有找到从对象中做到这一点的样本。我不确定数据的大小是否应该逐行写我所拥有的选项。欢迎所有输入,如果有一些样本将是完美的。目标是将数据对象写入Azure Blob存储中的csv文件。

2 个答案:

答案 0 :(得分:2)

我假定您正在使用最新版本的.NET(9.3.3)的C#编写代码。

这是我的代码,用于实现您将大量数据对象直接写入Azure Blob存储的需求。

using System;
using System.Collections;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

namespace WriteCSVDataToBlob
{

    class Record
    {
        string[] cols;

        public Record(string[] cols)
        {
            this.cols= cols;
        }

        override public string ToString()
        {
            return String.Join(',', cols);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var arr = new ArrayList();
            arr.Add(new Record(new string[]{ "A", "B","one" }));
            arr.Add(new Record(new string[] { "C", "D","two"}));
            string storageConnectionString = "<your storage connection string>";
            var storageAccount = CloudStorageAccount.Parse(storageConnectionString);
            var client = storageAccount.CreateCloudBlobClient();
            var container = client.GetContainerReference("test");
            var blob = container.GetBlockBlobReference("data.txt");
            using (CloudBlobStream x = blob.OpenWriteAsync().Result)
            {
                foreach(var rec in arr)
                {
                    x.Write(System.Text.Encoding.Default.GetBytes(rec.ToString()+"\n"));
                }
                x.Flush();
                x.Close();
            }
        }
    }
}

答案 1 :(得分:0)

@Peter Pan的解决方案适用于Microsoft.Azure.Storage.Blob v11.1.0。 在较新版本的azure blob存储中,您可以使用以下命令:

                using (var writer = new StreamWriter(new MemoryStream()))
                using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
                {
                    csv.Configuration.Delimiter = userInputModel.Separator;
                    csv.WriteRecords(arr);
                    writer.Flush();

                    writer.BaseStream.Seek(0, SeekOrigin.Begin);

                    client.AppendBlock(writer.BaseStream);
                }