将对象转换为CSV,然后压缩而不接触物理存储

时间:2018-10-05 10:25:58

标签: c# csv gzip

场景

我有一个对象,我将其转换为平面CSV,然后压缩并上传到文件存储中。

我可以按照以下步骤轻松地做到这一点。

  1. 将对象转换为CSV文件。
  2. 压缩文件
  3. 上传文件。

但是

我不希望因接触物理存储而遭受损失,因此希望在内存中完成所有这些操作。

当前执行不正确

  1. 将对象转换为CSV字节数组
  2. 压缩字节数组
  3. 将字节数组上传到文件存储

问题

我实际上正在做的是压缩字节数组并上传。这显然是错误的。 (因为压缩的Gzip文件未压缩时,它包含csv的字节数组,而不是实际的csv本身。)

是否可以在内存中创建“ file.csv”之类的文件,然后在内存中进行压缩,而不是压缩字节数组?

我遇到的问题是,当保存到物理位置时,似乎只能命名文件并指定其扩展名。

当前实现的代码示例

public byte[] Example(IEnumerable<object> data)
    {
        // Convert Object to CSV and write to byte array.
        byte[] bytes = null;
        using (var ms = new MemoryStream())
        {
            TextWriter writer = new StreamWriter(ms);
            var csv = new CsvWriter(writer);
            csv.WriteRecords(data);
            writer.Flush();
            ms.Position = 0;
            bytes = ms.ToArray();
        }

        //Compress byte array
        using (var compressedStream = new MemoryStream(bytes))
        using (var resultStream = new MemoryStream())
        using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            zipStream.CopyTo(resultStream);
            zipStream.Close();

            var gzipByteArray =  resultStream.ToArray();
            //Upload to AzureStorage
            new AzureHelper().UploadFromByteArray(gzipByteArray, 0, gzipByteArray.Length);
        }
    }

1 个答案:

答案 0 :(得分:1)

将用于上传的Stream包裹在GZipStream中,将CSV写入其中,然后您将上传压缩的CSV。