背景:
我有一个 CSV 文件,我需要准备并验证每行中的每个元素,并创建一个具有有效数据的类的集合。
IE
CSV 文件如下所示:
EmpID,FirstName,LastName,Salary
1,James,Help,100000
2,Jane,Scott,1000
3,Mary,Fraze,10000
类看起来像:
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; }
}
以下是每个字段所需的验证:
-
EmpID:
- 它是必填字段,因此不能为空或为空
- 它应该只是一个整数
- 不应超过 2 位数字
- 它应该存在于数据库中(查询该数据库并检查员工是否使用此 empid 退出)。
-
名字(对姓氏进行相同的验证):
- 它是必填字段,因此不能为空或为空
- 应该只是字母。
- 不允许超过 30 个字符
-
Salary:
- 它是必填字段,因此不能为空或为空
- 它应该是一个小数。
为了实现这一目标,我的方法如下:
- 逐行读取CSV文件
- 对于每个元素,即 EmpId、FirstName...等通过调用具有验证逻辑的各个方法来执行所需的验证。例如:
公共 bool ValidateIsDecimal(字符串值) { }
公共布尔ValidateIsEmpIdExists(字符串值){}
ETC
- 如果有效,则填写“Employees”类的相应属性。
- 如果无效,请填写“ErrorReason”属性,并提供导致验证失败的适当原因。(例如:缺少必需的字段或数据类型不是十进制等)
- 将此类添加到员工集合(例如:列表)
所以,我的问题是,这是正确的方法吗,还是有其他更好/更干净的方法来验证类属性。
Thanks
我会考虑使用C# 数据注释 http://msdn.microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx命名空间。我经常将它们用于 MVC 模型,它们非常有帮助。
我认为这会很有帮助的原因是您可以尝试在 try/catch 块中创建一个新的Employees对象并捕获验证异常,例如:
List<Employees> empList = new List<Employees>();
foreach (var row in csvRows){
try {
//Parse the row here and create the object. don't do any validation here
var employee = CreateEmployeeFromRow(row);
empList.Add(employee);
}
catch (ValidationException ve){
//do whatever
}
}
你的课程看起来像:
using System.ComponentModel.DataAnnotations;
public class Employees
{
[Required, RangeAttribute(0, 99)]
public int EmpID { get; set; }
[Required, Length(30), RegularExpression("/^[A-Za-z]+$/")]
public string FirstName { get; set; }
[Required, Length(30), RegularExpression("/^[A-Za-z]+$/")]
public string LastName { get; set; }
[Required]
public decimal Salary { get; set; }
}
为了避免重复的员工 ID,我会在插入数据库之前检查一下。这并不会真正使员工对象无效(或者 CSV 中的行无效,因为它是正确的格式)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)