Skip to content

Commit 0dcfb3a

Browse files
committed
improve column match & tests
1 parent 0c61acc commit 0dcfb3a

2 files changed

Lines changed: 84 additions & 26 deletions

File tree

RecordParser.Test/FileReaderTest.cs

Lines changed: 76 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -570,48 +570,100 @@ public void Read_plain_text_of_fixed_length_file(string fileContent, bool parall
570570
result.Should().BeEquivalentTo(expected, cfg => cfg.WithStrictOrdering());
571571
}
572572

573+
public record RegularCaseRecord(int Aaa, int Bbb, int Ccc, int Ddd);
574+
573575
[Theory]
574-
[MemberData(nameof(Given_quoted_csv_file_should_read_quoted_properly_theory), new object[] { "AllFieldsQuotedCsv.csv" })]
575-
public void Read_csv_file_with_header_should_automatic_bind_mapping(string fileContent, bool hasHeader, bool parallelProcessing, bool blankLineAtEnd, int repeat)
576+
[InlineData("\"AAA\",\"BBB\",\"CCC\",\"DDD\"")]
577+
[InlineData("AAA,BBB,CCC,DDD")]
578+
[InlineData("aaa,bbb,ccc,ddd")]
579+
[InlineData("AAA , BBB , CCC , DDD")]
580+
[InlineData("A_AA,B_BB,C_CC,D_DD")]
581+
public void Read_csv_file_with_header_in_different_case_should_automatic_bind_mapping(string header)
576582
{
577-
if (!hasHeader)
578-
return;
583+
// Arrange
584+
585+
var fileContent = $"""
586+
{header}
587+
1,2,3,4
588+
5,6,7,8
589+
9,10,11,12
590+
13,14,15,16
591+
87,88,89,100
592+
89,99,100,101
593+
88,89,90,91
594+
""";
595+
596+
var reader = new StringReader(fileContent);
597+
var expected = new RegularCaseRecord[]
598+
{
599+
new(1,2,3,4),
600+
new(5,6,7,8),
601+
new(9,10,11,12),
602+
new(13,14,15,16),
603+
new(87,88,89,100),
604+
new(89,99,100,101),
605+
new(88,89,90,91),
606+
};
607+
608+
var readOptions = new VariableLengthReaderOptions
609+
{
610+
HasHeader = true,
611+
ParallelismOptions = new() { Enabled = false },
612+
ContainsQuotedFields = true,
613+
};
614+
615+
// Act
616+
617+
var items = reader.ReadRecords<RegularCaseRecord>(readOptions, skipMismatchedColumns: false);
618+
619+
// Assert
620+
621+
items.Should().BeEquivalentTo(expected, cfg => cfg.WithStrictOrdering());
622+
}
579623

624+
[Fact]
625+
public void Read_csv_file_with_header_should_automatic_bind_support_additional_configuration()
626+
{
580627
// Arrange
581628

582-
fileContent = fileContent.Replace(Header, "id,name,age,birthday,gender,email,UNMAPPED,children");
583-
using var fileStream = fileContent.ToStream();
584-
using var streamReader = new StreamReader(fileStream, Encoding.UTF8);
629+
var fileContent = $"""
630+
AAA,BBB,CCC,DDD
631+
1,2,3,4
632+
5,6,7,8
633+
9,10,11,12
634+
13,14,15,16
635+
87,88,89,100
636+
89,99,100,101
637+
88,89,90,91
638+
""";
585639

586-
var expectedItems = new PersonComplete[]
640+
var reader = new StringReader(fileContent);
641+
var expected = new RegularCaseRecord[]
587642
{
588-
new () { id = new Guid("ec9a8be9-a000-503b-adcf-7266804f1eb1"), name = "Lilly Bradley", age = 21, birthday = DateTime.Parse("11/16/1977"), gender = Gender.Male, email = "pak@witak.bf", children = true },
589-
new () { id = new Guid("63858071-cbb3-5abd-9f88-3dfd565cc4ab"), name = "Lucy Berry", age = 49, birthday = DateTime.Parse("11/12/1961"), gender = Gender.Female, email = "vanvo@ro.pk", children = false },
590-
new () { id = new Guid("203804f9-93e7-5510-8bb2-177296bafe6a"), name = "Frank Fox", age = 36, birthday = DateTime.Parse("3/19/1977"), gender = Gender.Male, email = "vav@ped.fj", children = true },
591-
new () { id = new Guid("a8af66fb-bad4-51eb-810c-bf3ca22337c6"), name = "Isabel Todd", age = 51, birthday = DateTime.Parse("9/16/1999"), gender = Gender.Female, email = "gu@or.bz", children = false },
592-
new () { id = new Guid("1a3d8a66-3e0c-50eb-99c1-a3926bce15ed"), name = $"Joseph {Environment.NewLine}Scott", age = 55, birthday = DateTime.Parse("10/26/1986"), gender = Gender.Male, email = "bup@vugeb.tt", children = false },
593-
new () { id = new Guid("aa7d4395-f10f-5776-9912-e3d86c4b9d3c"), name = "Gilbert Brooks", age = 56, birthday = DateTime.Parse("3/1/1956"), gender = Gender.Female, email = "epiju@ba.ly", children = true },
594-
new () { id = new Guid("1d25b811-4002-5744-ac40-93a50f2a442c"), name = "Louis \"Ronaldo\" Bennett", age = 25, birthday = DateTime.Parse("4/4/1967"), gender = Gender.Male, email = "ma@itrovive.tv", children = true },
595-
new () { id = new Guid("8e963ae5-a9ed-5572-b11c-566abc6a8a56"), name = "Norman Parker", age = 57, birthday = DateTime.Parse("4/17/1969"), gender = Gender.Male, email = "omi@hewepa.bw", children = true },
596-
new () { id = new Guid("4d373cfb-79e3-54ce-87ff-f2a08fde8f28"), name = "Gary Doyle", age = 20, birthday = DateTime.Parse("1/21/1958"), gender = Gender.Male, email = "orjohma@cabmofa.ps", children = true },
597-
new () { id = new Guid("5af00cdf-0758-5317-bcdf-c9a3337cc266"), name = "Bruce Silva", age = 39, birthday = DateTime.Parse("1/11/1968"), gender = Gender.Female, email = "ta@ovonib.ir", children = true },
598-
}
599-
.Repeat(repeat);
643+
new(10,20,30,40),
644+
new(50,60,70,80),
645+
new(90,100,110,120),
646+
new(130,140,150,160),
647+
new(870,880,890,1000),
648+
new(890,990,1000,1010),
649+
new(880,890,900,910),
650+
};
600651

601652
var readOptions = new VariableLengthReaderOptions
602653
{
603-
HasHeader = hasHeader,
604-
ParallelismOptions = new() { Enabled = parallelProcessing },
654+
HasHeader = true,
655+
ParallelismOptions = new() { Enabled = false },
605656
ContainsQuotedFields = true,
606657
};
607658

608659
// Act
609660

610-
var items = streamReader.ReadRecords<PersonComplete>(readOptions, skipMismatchedColumns: true);
661+
var items = reader.ReadRecords<RegularCaseRecord>(readOptions, false, builder =>
662+
builder.DefaultTypeConvert(x => int.Parse(x) * 10));
611663

612664
// Assert
613665

614-
items.Should().BeEquivalentTo(expectedItems, cfg => cfg.WithStrictOrdering());
666+
items.Should().BeEquivalentTo(expected, cfg => cfg.WithStrictOrdering());
615667
}
616668
}
617669
}

RecordParser/Extensions/FileReader/VariableLengthReaderExtensions.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,14 @@ private static IVariableLengthReader<T> BuildParser<T>(IEnumerable<string> colum
8383
{
8484
try
8585
{
86-
var expression = CreateExpression<T>(column.Trim());
87-
builder.Map((dynamic)expression);
86+
var cleaned = column
87+
.Replace("_", string.Empty)
88+
.Replace("'", string.Empty)
89+
.Replace("\"", string.Empty)
90+
.Trim();
91+
92+
dynamic expression = CreateExpression<T>(cleaned);
93+
builder.Map(expression);
8894
}
8995
catch when (skipMismatchedColumns)
9096
{

0 commit comments

Comments
 (0)