public void DuplicateFieldNamesTest() { var headerNameCounts = new Dictionary <string, int>(); var config = new CsvConfiguration(CultureInfo.InvariantCulture) { GetDynamicPropertyName = args => { var header = args.Context.Reader.HeaderRecord[args.FieldIndex]; var prepareHeaderForMatchArgs = new PrepareHeaderForMatchArgs { FieldIndex = args.FieldIndex, Header = header, }; header = args.Context.Reader.Configuration.PrepareHeaderForMatch(prepareHeaderForMatchArgs); var name = headerNameCounts[header] > 1 ? $"{header}{args.FieldIndex}" : header; return(name); }, }; var parser = new ParserMock(config) { { "Id", "Name", "Name" }, { "1", "foo", "bar" }, null }; using (var csv = new CsvReader(parser)) { csv.Read(); csv.ReadHeader(); var counts = (from header in csv.Context.Reader.HeaderRecord.Select((h, i) => csv.Configuration.PrepareHeaderForMatch(new PrepareHeaderForMatchArgs { FieldIndex = i, Header = h })) group header by header into g select new { Header = g.Key, Count = g.Count() }).ToDictionary(x => x.Header, x => x.Count); foreach (var count in counts) { headerNameCounts.Add(count.Key, count.Value); } var records = csv.GetRecords <dynamic>().ToList(); var record = records[0]; Assert.AreEqual("1", record.Id); Assert.AreEqual("foo", record.Name1); Assert.AreEqual("bar", record.Name2); } }
/// <summary> /// Returns the header name ran through <see cref="PrepareHeaderForMatch(PrepareHeaderForMatchArgs)"/>. /// If no header exists, property names will be Field1, Field2, Field3, etc. /// </summary> /// <param name="args">The args.</param> public static string GetDynamicPropertyName(GetDynamicPropertyNameArgs args) { if (args.Context.Reader.HeaderRecord == null) { return($"Field{args.FieldIndex + 1}"); } var header = args.Context.Reader.HeaderRecord[args.FieldIndex]; var prepareHeaderForMatchArgs = new PrepareHeaderForMatchArgs(header, args.FieldIndex); header = args.Context.Reader.Configuration.PrepareHeaderForMatch(prepareHeaderForMatchArgs); return(header); }
/// <summary> /// Returns the <see name="PrepareHeaderForMatchArgs.Header"/> as given. /// </summary> public static string PrepareHeaderForMatch(PrepareHeaderForMatchArgs args) { return(args.Header); }