'How to ignore empty rows in CSV when reading
Trying to read a CSV file that has empty rows (usually at the end) using CsvHelper.GetRecords<T>()
.
Without the empty rows this works a treat. However if the CSV file has an empty row (defined as , , , , , ) then it throws a TypeConverterException
Text: ''
MemberType: IntelligentEditing.PerfectIt.Core.DataTypes.Styles.StyleRuleType
TypeConverter: 'CsvHelper.TypeConversion.EnumConverter'
I have gone through the documentation (https://joshclose.github.io/CsvHelper/api/CsvHelper.Configuration/Configuration/) and have tried setting up the configuration object to IgnoreBlankLines = true
however this has not worked.
Simplified for an example:
public enum ItemTypeEnum
{
Unknown = 0,
Accounts = 1,
HR = 2,
}
public class CsvItemDto
{
public int Id { get; set; }
public string Value { get; set; }
public ItemTypeEnum ItemType { get; set; }
}
.
.
.
var configuration = new Configuration()
{
HasHeaderRecord = true,
HeaderValidated = null,
MissingFieldFound = null,
IgnoreBlankLines = true,
};
var csv = new CsvReader(textReader, configuration);
var rows = csv.GetRecords<CsvItemDto>();
if (rows != null)
{
var items = rows.ToList();
//Throws exception here
}
The CSV would usually contain something like this:
Id,Value,ItemType
1,This,Unknown
2,That,Accounts
3,Other,HR
,,
,,
I expected the IgnoreBlankLines
to ignore the blank rows in the CSV but it is not. Any ideas?
Solution 1:[1]
you can try to implement ShouldSkipRecord on Configuration to choose skip or not
var configuration = new Configuration () {
HasHeaderRecord = true,
HeaderValidated = null,
MissingFieldFound = null,
IgnoreBlankLines = true,
ShouldSkipRecord = (records) =>
{
// Implement logic here
return false;
}
};
Solution 2:[2]
@phat.huynh has the right idea. Just tell it to skip any record where all the fields are empty strings.
var configuration = new Configuration()
{
HasHeaderRecord = true,
HeaderValidated = null,
MissingFieldFound = null,
ShouldSkipRecord = record => record.Record.All(field => String.IsNullOrWhiteSpace(field))
};
Solution 3:[3]
An alternative way, in CsvHelper 23.0.0
, is managing the reader exceptions
var conf = new CsvConfiguration(new CultureInfo("en-US"));
conf.ReadingExceptionOccurred = (exc) =>
{
Console.WriteLine("Error");
return false;
};
One can log it, throw it, bypass it returning false and even discriminate behaviors having a look at the exception source.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Phat Huynh |
Solution 2 | thargenediad |
Solution 3 | Gonçalo Peres |