Filehelper根据异常消息区分错误并操纵记录字符串

时间:2016-09-23 14:31:30

标签: c# linq filehelpers

我正在使用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;
}
  1. 现在对我而言,任何非空的错误都是至关重要的,因此我必须单独处理。
  2. 对于非严重错误,在本例中为datecolumn,我需要用null替换错误的值。
  3. 我可以使用下面的代码实现我的第一个要求(它仍然是粗糙的方式)

     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);
                }
            }
        }
    

    有任何想法要达到第二个要求吗?

1 个答案:

答案 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;

现在,您在阅读文件时没有错误,如果文件中的日期字段错误,您将在模型类中获得空值。

希望这有帮助!