2026-07-02 15:53:30 +08:00
|
|
|
|
# 解析器设计
|
|
|
|
|
|
|
|
|
|
|
|
> 所属模块:[架构概览](../概览.md)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 文档索引
|
|
|
|
|
|
|
|
|
|
|
|
| 文档 | 说明 |
|
|
|
|
|
|
|------|------|
|
2026-07-02 18:13:56 +08:00
|
|
|
|
| [文件名解析器](./FileNameParser.md) | 从文件名提取场景信息 |
|
2026-07-02 15:53:30 +08:00
|
|
|
|
| [Qfod 解析器](./Qfod解析器.md) | Qfod 格式日志解析设计 |
|
|
|
|
|
|
| [Ploss 解析器](./Ploss解析器.md) | Ploss FOD 格式日志解析设计 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 通用接口定义
|
|
|
|
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
|
|
// Parsers/IParser.cs
|
|
|
|
|
|
namespace WCTDataMiner.Parsers;
|
|
|
|
|
|
|
|
|
|
|
|
public interface IParser<TRecord>
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 判断是否可以解析该行
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
bool CanParse(string line);
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 解析日志行
|
|
|
|
|
|
/// </summary>
|
2026-07-02 18:13:56 +08:00
|
|
|
|
/// <param name="line">日志行内容</param>
|
|
|
|
|
|
/// <param name="scenarioId">关联的测试场景ID,用于外键关联(由 ParseService 从 FileNameParser 获取后传入)</param>
|
|
|
|
|
|
ParseResult<TRecord> Parse(string line, Guid scenarioId);
|
2026-07-02 15:53:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public record ParseResult<TRecord>
|
|
|
|
|
|
{
|
|
|
|
|
|
public bool IsSuccess { get; init; }
|
|
|
|
|
|
public TRecord? Record { get; init; }
|
|
|
|
|
|
public string? ErrorType { get; init; }
|
|
|
|
|
|
public string? ErrorMessage { get; init; }
|
|
|
|
|
|
|
|
|
|
|
|
public static ParseResult<TRecord> Success(TRecord record) =>
|
|
|
|
|
|
new() { IsSuccess = true, Record = record };
|
|
|
|
|
|
|
|
|
|
|
|
public static ParseResult<TRecord> Failure(string errorType, string errorMessage) =>
|
|
|
|
|
|
new() { IsSuccess = false, ErrorType = errorType, ErrorMessage = errorMessage };
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 解析流程
|
|
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
|
flowchart TD
|
|
|
|
|
|
A[读取日志文件] --> B[逐行遍历]
|
|
|
|
|
|
B --> C{判断行类型}
|
|
|
|
|
|
C -->|Qfod| D[QfodParser.Parse]
|
|
|
|
|
|
C -->|Ploss| E[PlossParser.Parse]
|
|
|
|
|
|
C -->|其他| F[跳过]
|
|
|
|
|
|
D --> G{解析成功?}
|
|
|
|
|
|
E --> G
|
|
|
|
|
|
G -->|成功| H[添加到记录列表]
|
|
|
|
|
|
G -->|失败| I[记录到 ParseError]
|
|
|
|
|
|
H --> J[批量保存到数据库]
|
|
|
|
|
|
I --> J
|
|
|
|
|
|
J --> K[输出解析报告]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 错误类型定义
|
|
|
|
|
|
|
|
|
|
|
|
| ErrorType | 说明 | 处理方式 |
|
|
|
|
|
|
|-----------|------|----------|
|
|
|
|
|
|
| FORMAT_MISMATCH | 行格式不匹配正则表达式 | 跳过该行,记录原始内容 |
|
|
|
|
|
|
| TYPE_CONVERSION | 字段类型转换失败 | 跳过该行,记录错误字段 |
|
2026-07-02 18:13:56 +08:00
|
|
|
|
|
|
|
|
|
|
> **说明**:VALUE_OUT_OF_RANGE 错误类型暂未实现,后续可根据需要添加字段值范围校验逻辑。
|