Как использовать библиотеку FileHelper для получения количества разделителей - PullRequest
0 голосов
/ 25 февраля 2020

Использование библиотеки FileHelper Есть ли способ получить исключение, если в записи нет ожидаемого количества разделителей в строке?

И еще один вопрос: есть ли способ получить исключение, если например, конкретное поле Имя больше ожидаемой длины?

Если я установлю имя равным maxLength 30, я получу исключение, если оно больше 30.

Или поле просто не равно ожидаемой длине?

1 Ответ

1 голос
/ 25 февраля 2020

получить исключение, если в записи нет ожидаемого количества разделителей в строке

Поведение 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: строка: 1 столбец: 4. Разделитель ',' не найден после поля 'k__BackingField' (запись содержит меньше полей, разделитель неверен или следующее поле должно быть помечено как необязательное). в FileHelpers.DelimitedField.BasicExtractString (строка LineInfo) в FileHelpers.DelimitedField.ExtractFieldString (строка LineInfo) в FileHelpers.FieldBase.ExtractFieldValue (строка LineInfo) в объекте FileHelpers.RecordOperations.StringHlindInlineShringInfo. .FileHelperEngine`1.ReadStreamAsList (читатель TextReader, Int32 maxRecords, DataTable dt)

есть способ получить исключение, если конкретное поле, например Name, превышает ожидаемую длину

Насколько я вижу, 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 mu st - строка длиной не более 5.

...