示例#1
0
        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);
                }
        }