将对象转换为 CSV,然后在不接触物理存储的情况下进行压缩
Convert object to CSV and then compress without touching physical storage
场景
我有一个对象,我将其转换为平面 CSV,然后压缩并上传到文件存储。
我可以按照以下步骤轻松完成此操作。
- 将对象转换为 CSV 文件。
- 压缩文件
- 上传文件。
但是
我不想因为接触物理存储而受到惩罚,所以想在内存中完成所有这些工作。
当前不正确的实现
- 将对象转换为 CSV 字节数组
- 压缩字节数组
- 上传字节数组到文件存储
问题
我实际上在做的是压缩一个字节数组并上传它。这显然是错误的。 (因为当压缩的 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);
}
}
将您用于上传的 Stream
包裹在 GZipStream
中,将您的 CSV 写入其中,然后您将上传压缩的 CSV。
场景
我有一个对象,我将其转换为平面 CSV,然后压缩并上传到文件存储。
我可以按照以下步骤轻松完成此操作。
- 将对象转换为 CSV 文件。
- 压缩文件
- 上传文件。
但是
我不想因为接触物理存储而受到惩罚,所以想在内存中完成所有这些工作。
当前不正确的实现
- 将对象转换为 CSV 字节数组
- 压缩字节数组
- 上传字节数组到文件存储
问题
我实际上在做的是压缩一个字节数组并上传它。这显然是错误的。 (因为当压缩的 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);
}
}
将您用于上传的 Stream
包裹在 GZipStream
中,将您的 CSV 写入其中,然后您将上传压缩的 CSV。