在excel数据集上应用NRules



我有一个记录数的excel。我想在上面应用Nrule。我想匹配两行,在它们上应用规则,并检查它是否违反了规则。例如:

Desc有些事情任何东西
Id 日期
1 12/31/21
1 12/31/21
2 Lorem Epsum

如果Excel文件是CSV,则可以使用CsvHelper将数据读取到域模型中。如果它真的是一个Excel文档,那么SO上有一些文章概述了如何从Excel加载数据。

使用CsvHelper和NRules,这里有一种方法可以加载数据并实现请求的规则。

using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;
using NRules;
using NRules.Fluent;
using NRules.Fluent.Dsl;
//Read records from CSV file
using var reader = new StreamReader(@"Data.csv");
var configuration = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true };
using var csv = new CsvReader(reader, configuration);
var records = csv.GetRecords<Record>();
//Load rule(s) and compile into NRules session
var repository = new RuleRepository();
repository.Load(x => x.From(typeof(SameDateRule)));
var factory = repository.Compile();
var session = factory.CreateSession();
//Insert records as facts and fire the rules
session.InsertAll(records);
session.Fire();
//Get results from the session
var violations = session.Query<Violation>();
Console.WriteLine($"Found {violations.Count()} violation(s)");
public class Record
{
public int Id { get; set; }
public DateTime Date { get; set; }
[CsvHelper.Configuration.Attributes.Name("Desc")]
public string Description { get; set; }
}
public class Violation
{
public Violation(IGrouping<DateTime, Record> records)
{
Date = records.Key;
Records = records.ToArray();
}
public DateTime Date { get; }
public IReadOnlyCollection<Record> Records { get; }
}
public class SameDateRule : Rule
{
public override void Define()
{
IGrouping<DateTime, Record> records = default;
When()
.Query(() => records, q => q
.Match<Record>()
.GroupBy(x => x.Date)
.Where(g => g.Any(x => x.Description == "Somethings")
&& g.Any(x => x.Description == "Anything")));
Then()
.Do(ctx => ctx.Insert(new Violation(records)));
}
}

最新更新