public async Task ProcessAsync(Uri uri, Stream outputStream) { using (var outputZip = new ZipArchive(outputStream, ZipArchiveMode.Create, leaveOpen: true)) using (var containerBuilder = new ContainerBuilder(outputZip)) { var stopWatch = new Stopwatch(); stopWatch.Start(); CSVMapping csvMapping = null; var streamParser = new StreamParser(); var file = _downloader.GetFile(uri); var zip = _zipProcessor.UnZip(file); foreach (var zipEntry in zip.Entries) { if (!zipEntry.FullName.ToLower().EndsWith(".xml")) { continue; } using (var inputStream = zipEntry.Open()) using (var stream = new MemoryStream()) { _transformer.Transform(inputStream, stream); if (stream.Length == 0) { continue; } stream.Position = 0; var data = await streamParser.Parse(stream); csvMapping = _mappingProvider.GetMappingByData(data); var serializer = new CsvSerializer(containerBuilder, csvMapping); await serializer.Serialize(data.ParsedEntities); } } // Add metadata to each archive if (csvMapping != null) { CSVMappingHelper.AddMetadata(outputZip, csvMapping); } stopWatch.Stop(); var ts = stopWatch.Elapsed; var elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); } }