Exemplo n.º 1
0
        /// <summary>
        /// 从csv文件里面读取对象
        /// </summary>
        /// <typeparam name="T">读取对象的类型</typeparam>
        /// <returns>对象集合的迭代器</returns>
        public IEnumerable <T> ReadObjects <T>() where T : class, new()
        {
            CsvFilePath.ShouldExistSuchFile();
            IsFirstLineHeader.ShouldEqual(true);

            return(ReadObjects <T>(CsvFilePath, Separators, Encoding));
        }
        public override async Task Process(Message message)
        {
            string specificationId   = message.GetUserProperty <string>("specification-id");
            string specificationName = message.GetUserProperty <string>("specification-name");

            if (specificationId == null)
            {
                string error = "Specification id missing";

                _logger.Error(error);

                throw new NonRetriableException(error);
            }

            IEnumerable <string> jobDefinitions = new List <string>
            {
                JobConstants.DefinitionNames.CreateInstructAllocationJob
            };

            IEnumerable <string> jobTypesRunning = await GetJobTypes(specificationId, jobDefinitions);

            if (!jobTypesRunning.IsNullOrEmpty())
            {
                string errorMessage = string.Join(Environment.NewLine, jobTypesRunning.Select(_ => $"{_} is still running"));
                _logger.Error(errorMessage);

                throw new NonRetriableException(errorMessage);
            }

            string temporaryFilePath = new CsvFilePath(_fileSystemCacheSettings.Path, specificationId);

            EnsureFileIsNew(temporaryFilePath);

            bool outputHeaders = true;

            ApiResponse <SpecificationSummary> specificationSummaryResponse = await _specificationsApiClientPolicy.ExecuteAsync(() => _specificationsApiClient.GetSpecificationSummaryById(specificationId));

            if (specificationSummaryResponse?.Content == null)
            {
                string errorMessage = $"Specification: {specificationId} not found";
                _logger.Error(errorMessage);

                throw new NonRetriableException(errorMessage);
            }

            SpecificationSummary specificationSummary = specificationSummaryResponse.Content;

            IEnumerable <TemplateMappingItem> allMappings = new TemplateMappingItem[0];

            foreach (Reference reference in specificationSummary.FundingStreams)
            {
                ApiResponse <TemplateMapping> templateMapping = await _calculationsApiClientPolicy.ExecuteAsync(() => _calculationsApiClient.GetTemplateMapping(specificationId, reference.Id));

                if (templateMapping?.Content == null)
                {
                    continue;
                }

                allMappings = allMappings.Concat(templateMapping.Content.TemplateMappingItems);
            }

            if (allMappings.Any(_ => _.CalculationId == null))
            {
                string errorMessage = $"Specification: {specificationId} has missing calculations in template mapping";
                _logger.Error(errorMessage);

                throw new NonRetriableException(errorMessage);
            }

            await _resultsRepositoryPolicy.ExecuteAsync(() => _resultsRepository.ProviderResultsBatchProcessing(specificationId,
                                                                                                                providerResults =>
            {
                IEnumerable <ExpandoObject> csvRows = _resultsToCsvRowsTransformation.TransformProviderResultsIntoCsvRows(providerResults, allMappings.ToDictionary(_ => _.CalculationId));

                string csv = _csvUtils.AsCsv(csvRows, outputHeaders);

                _fileSystemAccess.Append(temporaryFilePath, csv)
                .GetAwaiter()
                .GetResult();

                outputHeaders = false;
                return(Task.CompletedTask);
            }, BatchSize)
                                                        );

            ICloudBlob blob = _blobClient.GetBlockBlobReference($"calculation-results-{specificationId}.csv");

            blob.Properties.ContentDisposition = $"attachment; filename={GetPrettyFileName(specificationName)}";

            await using Stream csvFileStream = _fileSystemAccess.OpenRead(temporaryFilePath);

            await _blobClientPolicy.ExecuteAsync(() => UploadBlob(blob, csvFileStream, GetMetadata(specificationId, specificationName)));
        }
Exemplo n.º 3
0
 /// <summary>
 /// 依次将每行分隔, 返回字符串数组
 /// </summary>
 /// <returns></returns>
 public IEnumerable <string[]> ReadStrings()
 {
     CsvFilePath.ShouldExistSuchFile();
     return(ReadStrings(CsvFilePath, Separators, IsFirstLineHeader, Encoding));
 }
Exemplo n.º 4
0
 /// <summary>
 /// 将每行分隔后, 返回字符串数组和行号
 /// </summary>
 public IEnumerable <(string[] values, int lineNumber)> ReadStringsWithLineNumber()
 {
     CsvFilePath.ShouldExistSuchFile();
     return(ReadStringsWithLineNumber(CsvFilePath, Separators, IsFirstLineHeader, Encoding));
 }
Exemplo n.º 5
0
 /// <summary>
 /// 读取文件标题行
 /// </summary>
 /// <returns>Csv标题</returns>
 public CsvHeader ReadHeader()
 {
     CsvFilePath.ShouldExistSuchFile();
     return(ReadHeader(CsvFilePath, Separators, Encoding));
 }