From 8f74d8dd2308afc4343890522349deb7f257beec Mon Sep 17 00:00:00 2001 From: Robert Hague Date: Fri, 16 Jun 2023 16:45:52 +0200 Subject: [PATCH 1/3] Always update CsvReader.ColumnCount --- src/CsvHelper/CsvReader.cs | 5 ++++- tests/CsvHelper.Tests/CsvReaderTests.cs | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/CsvHelper/CsvReader.cs b/src/CsvHelper/CsvReader.cs index bac0adf34..8548894ff 100644 --- a/src/CsvHelper/CsvReader.cs +++ b/src/CsvHelper/CsvReader.cs @@ -42,13 +42,16 @@ public class CsvReader : IReader private CsvContext context; private bool disposed; private IParser parser; + /// + /// The number of columns in a valid record, as determined using . + /// private int columnCount; private int currentIndex = -1; private bool hasBeenRead; private string[]? headerRecord; /// - public virtual int ColumnCount => columnCount; + public virtual int ColumnCount => parser.Count; /// public virtual int CurrentIndex => currentIndex; diff --git a/tests/CsvHelper.Tests/CsvReaderTests.cs b/tests/CsvHelper.Tests/CsvReaderTests.cs index aca071206..3c113ec63 100644 --- a/tests/CsvHelper.Tests/CsvReaderTests.cs +++ b/tests/CsvHelper.Tests/CsvReaderTests.cs @@ -50,6 +50,29 @@ public void HasHeaderRecordTest() Assert.Equal(Convert.ToInt32("2"), reader.GetField(1)); } + [Fact] + public void ColumnCountTest() + { + string csvString = """ + 1 + 1,2 + 1,2,3 + """; + var reader = new CsvReader(new StringReader(csvString), CultureInfo.InvariantCulture); + + Assert.True(reader.Read()); + Assert.Equal(1, reader.ColumnCount); + Assert.Equal(reader.Parser.Count, reader.ColumnCount); + + Assert.True(reader.Read()); + Assert.Equal(2, reader.ColumnCount); + Assert.Equal(reader.Parser.Count, reader.ColumnCount); + + Assert.True(reader.Read()); + Assert.Equal(3, reader.ColumnCount); + Assert.Equal(reader.Parser.Count, reader.ColumnCount); + } + [Fact] public void GetTypeTest() { From 8c7f8a258110f5c17eea3e0783af3b1289b97c3d Mon Sep 17 00:00:00 2001 From: Robert Hague Date: Mon, 31 Jul 2023 10:19:14 +0200 Subject: [PATCH 2/3] Strengthen test --- tests/CsvHelper.Tests/CsvReaderTests.cs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/CsvHelper.Tests/CsvReaderTests.cs b/tests/CsvHelper.Tests/CsvReaderTests.cs index 3c113ec63..df6e0ba16 100644 --- a/tests/CsvHelper.Tests/CsvReaderTests.cs +++ b/tests/CsvHelper.Tests/CsvReaderTests.cs @@ -50,15 +50,25 @@ public void HasHeaderRecordTest() Assert.Equal(Convert.ToInt32("2"), reader.GetField(1)); } - [Fact] - public void ColumnCountTest() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void ColumnCountTest(bool detectColumnCountChanges) { + var config = new CsvConfiguration(CultureInfo.InvariantCulture) + { + DetectColumnCountChanges = detectColumnCountChanges, + ReadingExceptionOccurred = _ => false + }; + string csvString = """ 1 1,2 1,2,3 + 1,2 + 1 """; - var reader = new CsvReader(new StringReader(csvString), CultureInfo.InvariantCulture); + var reader = new CsvReader(new StringReader(csvString), config); Assert.True(reader.Read()); Assert.Equal(1, reader.ColumnCount); @@ -71,6 +81,14 @@ public void ColumnCountTest() Assert.True(reader.Read()); Assert.Equal(3, reader.ColumnCount); Assert.Equal(reader.Parser.Count, reader.ColumnCount); + + Assert.True(reader.Read()); + Assert.Equal(2, reader.ColumnCount); + Assert.Equal(reader.Parser.Count, reader.ColumnCount); + + Assert.True(reader.Read()); + Assert.Equal(1, reader.ColumnCount); + Assert.Equal(reader.Parser.Count, reader.ColumnCount); } [Fact] From 22a73c750943f929e5bc13ef84b595faf00efa50 Mon Sep 17 00:00:00 2001 From: Robert Hague Date: Mon, 31 Jul 2023 10:25:53 +0200 Subject: [PATCH 3/3] Rename columnCount member to prevColumnCount --- src/CsvHelper/CsvReader.cs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/CsvHelper/CsvReader.cs b/src/CsvHelper/CsvReader.cs index 8548894ff..441d274cb 100644 --- a/src/CsvHelper/CsvReader.cs +++ b/src/CsvHelper/CsvReader.cs @@ -42,10 +42,7 @@ public class CsvReader : IReader private CsvContext context; private bool disposed; private IParser parser; - /// - /// The number of columns in a valid record, as determined using . - /// - private int columnCount; + private int prevColumnCount; private int currentIndex = -1; private bool hasBeenRead; private string[]? headerRecord; @@ -264,7 +261,7 @@ public virtual bool Read() if (detectColumnCountChanges && hasMoreRecords) { - if (columnCount > 0 && columnCount != parser.Count) + if (prevColumnCount > 0 && prevColumnCount != parser.Count) { var csvException = new BadDataException(string.Empty, parser.RawRecord, context, "An inconsistent number of columns has been detected."); @@ -275,7 +272,7 @@ public virtual bool Read() } } - columnCount = parser.Count; + prevColumnCount = parser.Count; } return hasMoreRecords; @@ -296,7 +293,7 @@ public virtual async Task ReadAsync() if (detectColumnCountChanges && hasMoreRecords) { - if (columnCount > 0 && columnCount != parser.Count) + if (prevColumnCount > 0 && prevColumnCount != parser.Count) { var csvException = new BadDataException(string.Empty, parser.RawRecord, context, "An inconsistent number of columns has been detected."); @@ -307,7 +304,7 @@ public virtual async Task ReadAsync() } } - columnCount = parser.Count; + prevColumnCount = parser.Count; } return hasMoreRecords;