我正在尝试从文本中提取数据。它是较大的文本。为了更好地理解。我有一个简单的类Test,它有一个atribute结果,即enum。
class Test{
private Result result;
public Test(string text){
this.Result = FindProblem(text);
}
......
public enum Result
{
SUCCESS = 1,
FAIL = 2,
NONE = 3
}
}
然后我有文本:
今天01:05:(NAME(备份失败-操作遇到错误。(NAME(
备份时失败:找不到文件(名称(
DISK_OPEN_ERROR今天01:04:(名称(成功备份-备份42,73 MB(压缩到7,32 MB(。(持续时间:1分钟(
今天00:59:(NAME(成功备份-备份了3.41 GB(压缩到379,17 MB(。(持续时间:4分钟(
我希望每一行都返回一个测试对象,其结果如下:result:Failed或result:Successful。
从文本返回所有对象的方法
public Result FindResult(string text)
{
var splitText = text.Split("n").ToList();
Result r = Result.NONE;
foreach (var item in splitText)
{
if (item.Contains("Failed"))
{
r = Result.FAIL;
}
else
{
r = Result.SUCCESS;
}
}
return r;
}
但它只返回结果SUCCESS。预期输出
result:FAIL
result:SUCCESS
result:SUCCESS
您可以在至少2个换行符上进行拆分,然后使用Select映射列表中的项目,并检查它是否包含"失败";
如果是,则返回Result.FAIL
,否则返回Result.SUCCESS
,因此函数的返回类型为List<Result>
class Test
{
private Result result;
public enum Result
{
SUCCESS = 1,
FAIL = 2,
NONE = 3
}
public List<Result> FindResult(string text)
{
return Regex
.Split(text, @"r?ns*r?n")
.Select(s => s.Contains("Failed") ? Result.FAIL : Result.SUCCESS)
.ToList();
}
}
然后你可以循环返回列表中的项目
Test test = new Test();
var results = test.FindResult(input);
foreach(var r in results) {
Console.WriteLine(r);
}
输出
FAIL
SUCCESS
SUCCESS
请参阅C#演示。