Skip to content

Commit

Permalink
Fixed issue with multiple character delimiter not working when the fi…
Browse files Browse the repository at this point in the history
…rst char of the delimiter precedes the actual delimiter.

e.g. 1!#2!!#3
  • Loading branch information
JoshClose committed Apr 17, 2020
1 parent 30b1333 commit 8751336
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/CsvHelper/CsvParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -878,6 +878,8 @@ protected virtual bool ReadDelimiter()
return true;
}

var originalC = c;
var charsRead = 0;
for (var i = 1; i < context.ParserConfiguration.Delimiter.Length; i++)
{
if (fieldReader.IsBufferEmpty && !fieldReader.FillBuffer())
Expand All @@ -887,8 +889,12 @@ protected virtual bool ReadDelimiter()
}

c = fieldReader.GetChar();
charsRead++;
if (c != context.ParserConfiguration.Delimiter[i])
{
c = originalC;
fieldReader.SetBufferPosition(-charsRead);

return false;
}
}
Expand Down
17 changes: 17 additions & 0 deletions tests/CsvHelper.Tests/Parsing/DelimiterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,22 @@ public void NullDelimiterTest()
Assert.AreEqual("3", line[2]);
}
}

[TestMethod]
public void FirstCharOfDelimiterNextToDelimiterTest()
{
var s = new StringBuilder();
s.AppendLine("1!#2!!#3");
using (var reader = new StringReader(s.ToString()))
using (var parser = new CsvParser(reader, CultureInfo.InvariantCulture))
{
parser.Configuration.Delimiter = "!#";
var row = parser.Read();

Assert.AreEqual("1", row[0]);
Assert.AreEqual("2!", row[1]);
Assert.AreEqual("3", row[2]);
}
}
}
}

0 comments on commit 8751336

Please sign in to comment.