我正在使用FileHelpers库来识别处理csv文件时的错误。
var engine = new DelimitedFileEngine<ModelClass>;
engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;
List<object> fileEngineResult = engine.ReadFile(fullFileName).ToList();
errorInfo = engine.ErrorManager.Errors;
我的ModelClass具有与我的csv文件中具有验证属性
的每列相对应的属性[DelimitedRecord(",")]
[IgnoreEmptyLines]
public class ModelClass
{
[FieldNotEmpty]
private string column1;
[FieldConverter(ConverterKind.Date, "MM/dd/yyyy")]
private DateTime datecolumn;
[FieldNotEmpty]
private string column3;
}
我可以使用下面的代码实现我的第一个要求(它仍然是粗糙的方式)
List<object> criticalErrorList = new List<object>();
List<object> softErrorList = new List<object>();
foreach (var error in errorInfo)
{
if (error.ExceptionInfo.InnerException.ToString().Contains("The value is empty and must be populated"))
{
criticalErrorList.Add(error);
}
else
{ error.RecordString = //replace recordstring for the error column with null;
softErrorList.Add(error);
}
}
}
有任何想法要达到第二个要求吗?
答案 0 :(得分:0)
更仔细地阅读你的问题我看到你真正想要的是当你的datecolum字段中有错误时获得一个空值。
我首先写了这个答案,我将它放在这里因为我认为你也可以从中受益。如果字段丢失,也许你可以得到一个空值,如果字段数据错误,也可以得到一个空值。
初始答案(使用可空类型处理缺失值。)
幸运的是,您不需要更改记录字符串(它是只读的),但您在FileHelpers中使用了built-in来实现这一点。更改模型,使日期列为可以为空的DateTime。
[FieldConverter(ConverterKind.Date, "MM/dd/yyyy")]
private DateTime? datecolumn;
另一种方法是,如果您希望日期列具有默认值。然后你可以使用另一个属性来装饰datecolumn成员:
[FieldNullValue(typeof(DateTime), "01/01/1900")]
[FieldConverter(ConverterKind.Date, "MM/dd/yyyy")]
private DateTime datecolumn;
更新回答:
数据错误时获取空值
转换器: 这是FileHelpers的另一个功能。您可以阅读更多相关信息here:
因此,假设您需要在日期列的数据错误时获取空值。您还需要将datecolumn字段更改为DateTime吗?但是你也需要一个转换器。
public class DateConverter : ConverterBase
{
public override object StringToField(string from)
{
//if you can't convert to date time.. .return null
DateTime date;
if (!DateTime.TryParse(from, out date))
return null;
return date;
}
public override string FieldToString(object fieldValue)
{
return ((DateTime) fieldValue).ToString("MM-dd-yyyy").Replace(".", "");
}
}
在你的模型类中,用转换器装饰字段:
[FieldConverter(typeof(DateConverter))]
public DateTime? datecolumn;
现在,您在阅读文件时没有错误,如果文件中的日期字段错误,您将在模型类中获得空值。
希望这有帮助!