首页 > 解决方案 > 如何使用 FileHelper 库获取分隔符的数量

问题描述

使用 FileHelper 库 如果记录在一行中没有预期数量的分隔符,有没有办法获得异常?

另一个问题是,如果特定字段(例如名称)超过预期长度,是否有办法获得异常?

如果我将名称设置为 maxLength 30,如果它高于 30,我会得到一个异常。

或者一个字段根本不等于预期长度?

标签: c#filehelpersfile-processingfileparsing

解决方案


如果记录在一行中没有预期数量的分隔符,则获取异常

如果行中没有足够/太多的字段,则抛出异常是默认 FileHelpers 行为,因此无需执行任何特殊操作即可获得它:

[DelimitedRecord(",")]
public class Test
{
    public int SomeInt { get; set; }
    public string SomeString { get; set; }
    public int SomeInt1 { get; set; }

    public override string ToString() =>
        $"{SomeInt} - {SomeString} - {SomeInt1}";
}


var result = new FileHelperEngine<Test>()
    .ReadString(@"123,That's the string")
    .Single();
Console.WriteLine(result);

会导致

FileHelpers.FileHelpersException: Line: 1 Column: 4. Delimiter ',' not found after field 'k__BackingField' (记录的字段较少,分隔符错误或下一个字段必须标记为可选)。在 FileHelpers.DelimitedField.BasicExtractString(LineInfo 行) 在 FileHelpers.DelimitedField.ExtractFieldString(LineInfo 行) 在 FileHelpers.FieldBase.ExtractFieldValue(LineInfo 行) 在 FileHelpers.RecordOperations.StringToRecord(对象记录, LineInfo 行, Object[] 值) 在 FileHelpers .FileHelperEngine`1.ReadStreamAsList(TextReader reader, Int32 maxRecords, DataTable dt)

如果特定字段(例如名称)超过预期长度,有没有办法获得异常

据我所知,FileHelpers 不支持开箱即用的标准 DataAnnotations(或者它实际上可以支持它,但由于https://github.com/dotnet/standard/issues/450它不起作用),所以您可能必须手动添加验证

所以,你安装https://www.nuget.org/packages/System.ComponentModel.Annotations/4.4.0

然后通过添加[StringLength(maximumLength: 5)]SomeString模型上的属性

[DelimitedRecord(",")]
public class Test
{
    public int SomeInt { get; set; }
    [StringLength(maximumLength: 5)]
    public string SomeString { get; set; }
    public int SomeInt1 { get; set; }

    public override string ToString() =>
        $"{SomeInt} - {SomeString} - {SomeInt1}";
}

var result = new FileHelperEngine<Test>()
    .ReadString(@"123,That's the string, 456")
    .Single();
Console.WriteLine(result);

var context = new ValidationContext(result, serviceProvider: null, items: null);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(result, context, results, validateAllProperties: true);
if (!isValid)
{
    Console.WriteLine("Not valid");
    foreach (var validationResult in results)
    {
        Console.WriteLine(validationResult.ErrorMessage);
    }
} 

您将获得以下输出

无效

SomeString 字段必须是最大长度为 5 的字符串。


推荐阅读