Конвертировать объект в CSV, а затем сжать, не касаясь физического хранилища - PullRequest
0 голосов
/ 05 октября 2018

Сценарий

У меня есть объект, который я преобразовываю в плоский 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 голосов
/ 05 октября 2018

Оберните Stream, который вы используете для загрузки, в GZipStream, запишите в него свой CSV, и тогда вы загрузите сжатый CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...