/// <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)); }