Background:
I have a CSV file, which I need to ready and validate each element in each row and create a collection of a class, having valid data.
i.e
CSV File looks like:
EmpID,FirstName,LastName,Salary
1,James,Help,100000
2,Jane,Scott,1000
3,Mary,Fraze,10000
Class looks like:
public class Employees
{
public int EmpID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Salary { get; set; }
public string ErrorReason { get; set; }
}
Here are the validations required for each field:
-
EmpID:
- Its a mandatory field, hence cannot be null or empty
- It should be only an integer
- It should be not more than 2 digits
- It should be present in database (query that database and check if an employee exits with this empid.
-
FirstName (same validation for LastName):
- Its a mandatory field, hence cannot be null or empty
- It should be only alphabets.
- Not more than 30 characters are allowed
-
Salary:
- Its a mandatory field, hence cannot be null or empty
- It should be a decimal.
To achieve this, here is my approach:
- Read CSV file row by row
- For each element i.e EmpId, FirstName… etc do the required validations by calling individual methods having validation logic.
eg:
public bool ValidateIsDecimal(string value) { }
public bool ValidateIsEmpIdExists(string value) { }
etc - If valid, fill corresponding property of "Employees" class.
- If NOT VALID, fill "ErrorReason" property, with appropriate reason as to what caused the validation to fail.(eg: Required filed was missing or datatype is not decimal etc)
- Add this Class to Employees collection (eg: List)
So, my question is, is this the right approach, or is there any other better/cleaner way of validating class properties.
Best Answer
If I needed to input data and capture errors, I would probably do something more like:
I wouldn't want to pollute the regular Employee (singular, use the plural for a collection of them) object with error messages. As in the note above, check out the FluentValidation library for your validation and capture a list of errors rather than just the first found.