Пример #1
0
        /// <summary>
        /// Creates the CSV file source.
        /// </summary>
        /// <param name="name">The name of the source.</param>
        /// <param name="connection">The connection.</param>
        /// <param name="config">The configuration.</param>
        /// <returns>
        /// A new IDataSource instance.
        /// </returns>
        private static IDataSource CreateCsvFileSource(string name, DataConnection connection, XElement config)
        {
            var filePattern = config.Attribute("FilePattern").Value;
            var mode        = (FolderMode)Enum.Parse(typeof(FolderMode), FindAttribute(config, "Mode") ?? "MultipleFile", true);

            // This ties us to the CsvHelper implementation but it makes like a little simpler.
            // If needed this can be wrapped at a later date in a custom class.
            var csvConfig = new Csv.Configuration();

            csvConfig.AllowComments            = ParseAttribute(FindElementText(config, "AllowComments"), csvConfig.AllowComments);
            csvConfig.Comment                  = ParseAttribute(FindElementText(config, "Comment"), csvConfig.Comment);
            csvConfig.Delimiter                = ParseAttribute(FindElementText(config, "Delimiter"), csvConfig.Delimiter);
            csvConfig.DetectColumnCountChanges = ParseAttribute(FindElementText(config, "DetectColumnCountChanges"), csvConfig.DetectColumnCountChanges);
            ////csvConfig.HasExcelSeparator = ParseAttribute(FindElementText(config, "HasExcelSeparator"), csvConfig.HasExcelSeparator);
            csvConfig.HasHeaderRecord  = ParseAttribute(FindElementText(config, "HasHeaderRecord"), csvConfig.HasHeaderRecord);
            csvConfig.IgnoreBlankLines = ParseAttribute(FindElementText(config, "IgnoreBlankLines"), csvConfig.IgnoreBlankLines);
            csvConfig.IgnoreQuotes     = ParseAttribute(FindElementText(config, "IgnoreQuotes"), csvConfig.IgnoreQuotes);
            csvConfig.Quote            = ParseAttribute(FindElementText(config, "Quote"), csvConfig.Quote);

            // These are defaulted because its the right way to handle the values.
            // If you absolutely need then set to true/false in the config file.
            if (ParseAttribute(FindElementText(config, "SkipEmptyRecords"), false))
            {
                csvConfig.ShouldSkipRecord = record => record.All(string.IsNullOrEmpty);
            }

            if (ParseAttribute(FindElementText(config, "TrimHeaders"), true))
            {
                csvConfig.PrepareHeaderForMatch = header => header?.Trim();
            }

            if (ParseAttribute(FindElementText(config, "IgnoreHeaderWhiteSpace"), true))
            {
                csvConfig.PrepareHeaderForMatch = header => csvConfig.PrepareHeaderForMatch(header)?.Replace(" ", string.Empty);
            }

            if (!ParseAttribute(FindElementText(config, "IsHeaderCaseSensitive"), false))
            {
                csvConfig.PrepareHeaderForMatch = header => csvConfig.PrepareHeaderForMatch(header)?.ToUpperInvariant();
            }

            csvConfig.TrimOptions = ParseAttribute(FindElementText(config, "TrimFields"), true) ? Csv.TrimOptions.Trim : Csv.TrimOptions.None;

            return(new CsvDataSource(name, connection, filePattern, mode, csvConfig));
        }