Skip to content

Commit

Permalink
Merge branch 'Rob-Hague-columncount'
Browse files Browse the repository at this point in the history
  • Loading branch information
JoshClose committed Jan 24, 2024
2 parents 1415c93 + 4814452 commit 356f84e
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/CsvHelper/CsvReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,13 @@ public class CsvReader : IReader
private CsvContext context;
private bool disposed;
private IParser parser;
private int columnCount;
private int prevColumnCount;
private int currentIndex = -1;
private bool hasBeenRead;
private string[] headerRecord;

/// <inheritdoc/>
public virtual int ColumnCount => columnCount;
public virtual int ColumnCount => parser.Count;

/// <inheritdoc/>
public virtual int CurrentIndex => currentIndex;
Expand Down Expand Up @@ -260,7 +260,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.");

Expand All @@ -271,7 +271,7 @@ public virtual bool Read()
}
}

columnCount = parser.Count;
prevColumnCount = parser.Count;
}

return hasMoreRecords;
Expand All @@ -292,7 +292,7 @@ public virtual async Task<bool> 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.");

Expand All @@ -303,7 +303,7 @@ public virtual async Task<bool> ReadAsync()
}
}

columnCount = parser.Count;
prevColumnCount = parser.Count;
}

return hasMoreRecords;
Expand Down
41 changes: 41 additions & 0 deletions tests/CsvHelper.Tests/CsvReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,47 @@ public void HasHeaderRecordTest()
Assert.Equal(Convert.ToInt32("2"), reader.GetField<int>(1));
}

[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), config);

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

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]
public void GetTypeTest()
{
Expand Down

0 comments on commit 356f84e

Please sign in to comment.