在C#开发中,保证导入系统的文件内容符合规范是数据质量管控的重要一环。我们可以通过定义清晰的验证规则,对文件中的数据进行结构化检查,从而过滤掉异常记录。

设计验证规则接口
为了让校验逻辑可扩展,可以先定义一个通用的规则接口,所有具体规则都实现该接口。这样在新增检查项时只需添加类,不需要改动主流程。
using System;
using System.Collections.Generic;
// 验证结果
public class ValidateResult
{
public bool IsValid { get; set; }
public string Message { get; set; }
}
// 规则接口
public interface IFileRule
{
string RuleName { get; }
ValidateResult Check(string lineContent);
}
// 示例:非空规则
public class NotEmptyRule : IFileRule
{
public string RuleName { get { return "NotEmpty"; } }
public ValidateResult Check(string lineContent)
{
if (string.IsNullOrWhiteSpace(lineContent))
{
return new ValidateResult { IsValid = false, Message = "内容不能为空" };
}
return new ValidateResult { IsValid = true, Message = "通过" };
}
}
实现具体校验规则
针对常见规范,可以实现多个规则类,例如长度限制、数字格式、日期格式等。下面示例检查行内容是否为纯数字且长度等于6。
using System.Text.RegularExpressions;
public class CodeFormatRule : IFileRule
{
public string RuleName { get { return "CodeFormat"; } }
public ValidateResult Check(string lineContent)
{
// 6位纯数字
if (!Regex.IsMatch(lineContent, @"^d{6}$"))
{
return new ValidateResult { IsValid = false, Message = "编码必须是6位数字" };
}
return new ValidateResult { IsValid = true, Message = "通过" };
}
}
执行规则并收集错误
读取文件后,对每一行依次执行所有规则,将不通过的信息记录下来,方便后续反馈给用户。
using System;
using System.Collections.Generic;
using System.IO;
public class FileValidator
{
private List<IFileRule> rules = new List<IFileRule>();
public void AddRule(IFileRule rule)
{
rules.Add(rule);
}
public List<string> ValidateFile(string path)
{
var errors = new List<string>();
int lineNo = 0;
foreach (var line in File.ReadLines(path))
{
lineNo++;
foreach (var rule in rules)
{
var r = rule.Check(line);
if (!r.IsValid)
{
errors.Add($"第{lineNo}行[{rule.RuleName}]:{r.Message}");
}
}
}
return errors;
}
}
在程序中调用
将规则注册到验证器,并对目标文件执行校验。如果返回的错误列表为空,说明文件内容符合规范。
class Program
{
static void Main()
{
var validator = new FileValidator();
validator.AddRule(new NotEmptyRule());
validator.AddRule(new CodeFormatRule());
var errs = validator.ValidateFile("data.txt");
if (errs.Count == 0)
{
Console.WriteLine("文件内容校验通过");
}
else
{
foreach (var e in errs)
{
Console.WriteLine(e);
}
}
}
}
处理大文件建议
对于体积较大的文件,应使用File.ReadLines而不是File.ReadAllLines,前者为惰性枚举,不会一次性载入内存。若单条记录跨多行,可结合StreamReader自行按块读取并缓存上下文。
| 方法 | 特点 |
|---|---|
| File.ReadLines | 逐行流式读取,内存占用低 |
| File.ReadAllLines | 一次性读入数组,适合小文件 |
注意:在规则中尽量复用正则表达式对象,避免频繁编译影响性能。
小结
通过将校验逻辑抽象为规则接口,C#可以写出结构清晰且易维护的文件内容验证程序。实际项目中还可将规则配置外置到JSON,实现不修改代码即可调整规范。