I am using CsvHelper to read/writer the data into Csv file. Now I want to parse the delimiter of the csv file. How can I get this please?
My code:
var parser = new CsvParser(txtReader);
delimiter = parser.Configuration.Delimiter;
I always got delimiter is "," but actually in the csv file the delimiter is "\t".
Since I had to deal with the possibility that, depending on the localization settings of the user, the CSV file (Saved in MS Excel) could contain a different delimiter, I ended up with the following approach :
public static string DetectDelimiter(StreamReader reader)
{
// assume one of following delimiters
var possibleDelimiters = new List<string> {",",";","\t","|"};
var headerLine = reader.ReadLine();
// reset the reader to initial position for outside reuse
// Eg. Csv helper won't find header line, because it has been read in the Reader
reader.BaseStream.Position = 0;
reader.DiscardBufferedData();
foreach (var possibleDelimiter in possibleDelimiters)
{
if (headerLine.Contains(possibleDelimiter))
{
return possibleDelimiter;
}
}
return possibleDelimiters[0];
}
I also needed to reset the reader's read position, since it was the same instance I used In the CsvReader constructor.
The usage was then as follows:
using (var textReader = new StreamReader(memoryStream))
{
var delimiter = DetectDelimiter(textReader);
using (var csv = new CsvReader(textReader))
{
csv.Configuration.Delimiter = delimiter;
... rest of the csv reader process
}
}