Exemplo n.º 1
0
        private static void SanitizeConfiguration(CsvDataReaderConfiguration configuration)
        {
            //Set all the static value indexes to -1 as the index does not matter for static values.
            var staticValueColumns = configuration.ColumnDefinitions.Where(cd => cd.ValueSource == ValueSource.StaticValue).ToList();

            if (staticValueColumns.Any())
            {
                staticValueColumns.ForEach(cd => cd.ColumnIndex = -1);
            }
        }
Exemplo n.º 2
0
        private static List <TypeCode> GetTypeCodes(CsvDataReaderConfiguration configuration)
        {
            var typeCodes = new List <TypeCode>(configuration.CsvColumnsCount);

            for (int i = 0; i < configuration.CsvColumnsCount; i++)
            {
                var csvColumn = configuration.ColumnDefinitions.SingleOrDefault(c => c.ColumnIndex == i);

                //If a column is not required, then default to empty data type.
                typeCodes.Add(csvColumn == null ? TypeCode.Empty : GetTypeCode(csvColumn.ColumnDataType));
            }
            return(typeCodes);
        }
Exemplo n.º 3
0
        private static IDataReader AddColumnMapping(CsvDataReaderConfiguration configuration, IDataReader dataReader)
        {
            //Decorate with column mapping functionality - only for columns that require the mapping
            var columnValueMappings = new Dictionary <string, int>(configuration.ColumnDefinitions.Count);

            configuration.ColumnDefinitions.Where(cd => cd.ColumnIndex >= 0).ToList()
            .ForEach(cd => columnValueMappings.Add(cd.ColumnName, cd.ColumnIndex));
            if (columnValueMappings.Count > 0)
            {
                dataReader = new DataReaderColumnMapping(columnValueMappings, dataReader);
            }

            return(dataReader);
        }
Exemplo n.º 4
0
        private static IDataReader AddValueTransformation(CsvDataReaderConfiguration configuration, IDataReader dataReader)
        {
            var transformationParamsMappings = new Dictionary <int, Dictionary <string, object> >(configuration.ColumnDefinitions.Count);

            configuration.ColumnDefinitions.Where(cd => cd.ValueSource == ValueSource.ColumnValue && cd.Params != null && cd.Params.Count > 0).ToList()
            .ForEach(cd => transformationParamsMappings.Add(cd.ColumnIndex, cd.Params));

            //Decorate with value transformation if there are any columns with custom parameters
            if (transformationParamsMappings.Count > 0)
            {
                dataReader = new DataReaderValueTransformation(transformationParamsMappings, dataReader);
            }

            return(dataReader);
        }
Exemplo n.º 5
0
        public IDataReader GetCsvDataReader(CsvDataReaderConfiguration configuration)
        {
            ValidateConfiguration(configuration);
            SanitizeConfiguration(configuration);

            //Create the base CSV data reader
            IDataReader dataReader = new CsvDataReader(configuration.CsvFilePath, GetTypeCodes(configuration));

            //Add decorators
            dataReader = AddColumnMapping(configuration, dataReader);
            dataReader = AddValueTransformation(configuration, dataReader);
            dataReader = AddExtraColumns(configuration, dataReader);

            return(dataReader);
        }
Exemplo n.º 6
0
        private static IDataReader AddExtraColumns(CsvDataReaderConfiguration configuration, IDataReader dataReader)
        {
            var extraColumns = configuration.ColumnDefinitions.Where(cd => cd.ValueSource == ValueSource.StaticValue).ToList();

            //Decorate with extra columns if the are any columns with static values
            if (extraColumns.Count > 0)
            {
                var extraColumnsDataReader = new DataReaderExtraColumns(dataReader);
                foreach (var extraColumn in extraColumns)
                {
                    extraColumnsDataReader.AddExtraColumn(extraColumn.ColumnName, extraColumn.Params[ParamKeys.Value]);
                }

                dataReader = extraColumnsDataReader;
            }

            return(dataReader);
        }
Exemplo n.º 7
0
        private void ValidateConfiguration(CsvDataReaderConfiguration configuration)
        {
            if (string.IsNullOrWhiteSpace(configuration?.CsvFilePath))
            {
                throw new ArgumentException("Configuration invalid. FilePath is required.");
            }
            if (configuration.CsvColumnsCount <= 0)
            {
                throw new ArgumentException("Configuration invalid. ColumnsCount needs to be positive.");
            }
            if (configuration.ColumnDefinitions == null || !configuration.ColumnDefinitions.Any())
            {
                throw new ArgumentException("Configuration invalid. CsvColumnDefinitions are required.");
            }
            if (configuration.ColumnDefinitions.Any(d => string.IsNullOrWhiteSpace(d.ColumnName) || string.IsNullOrWhiteSpace(d.ColumnDataType)))
            {
                throw new ArgumentException("Configuration invalid. ColumnName and ColumnDataType fields are required.");
            }
            if (configuration.ColumnDefinitions.Where(cd => cd.ValueSource != ValueSource.StaticValue).Select(cd => cd.ColumnIndex).Distinct().Count() !=
                configuration.ColumnDefinitions.Count(cd => cd.ValueSource != ValueSource.StaticValue))
            {
                throw new ArgumentException("Configuration invalid. ColumnIndex field has to have a unique value for non-static value sources.");
            }
            if (configuration.ColumnDefinitions.Select(cd => cd.ColumnName).Distinct().Count() !=
                configuration.ColumnDefinitions.Count)
            {
                throw new ArgumentException("Configuration invalid. ColumnName field has to have a unique value.");
            }
            var staticValueColumns = configuration.ColumnDefinitions
                                     .Where(cd => cd.ValueSource == ValueSource.StaticValue).ToList();

            staticValueColumns.ForEach(cd =>
            {
                if (cd.Params == null || !cd.Params.ContainsKey(ParamKeys.Value))
                {
                    throw new ArgumentException("Configuration invalid. Static value columns have to have a value parameter.");
                }
            });
        }