如何读取CSV文件多行人员数据,批量调用CreateUserName方法一次性生成所有用户名
批量处理CSV生成用户名的实现方案
核心设计原则
- 不改动现有通用结构:保留原有
Person类的无耦合设计,不增加与现有业务无关的属性,保证可以直接支撑后续其他业务场景 - 复用现有业务逻辑:完全保留原有的合法性校验规则、
CreateUserName用户名生成逻辑,避免批量流程和手动流程的规则不一致 - 容错处理:单条数据异常不影响整体批量流程运行
保留的通用业务代码
以下代码完全沿用已实现的结构,仅补充必要的边界防护,不做业务逻辑修改:
// 通用Person模型,无业务耦合,可用于任意人员相关业务场景 public class Person { public string FirstName { get; set; } public string LastName { get; set; } } // 原有用户名生成逻辑保持不变 public static string CreateUserName(Person person) { // 补充边界防护,避免FirstName长度不足2时触发索引越界异常 if (string.IsNullOrWhiteSpace(person?.FirstName) || person.FirstName.Length < 2) { throw new InvalidOperationException("FirstName长度不足2,无法生成用户名"); } return $"{person.LastName}{person.FirstName.Substring(0,2)}"; }
批量处理实现代码
/// <summary> /// 读取CSV文件,批量生成人员用户名并打印到控制台 /// </summary> /// <param name="csvFilePath">CSV文件路径</param> public static void BatchGenerateUserNameFromCsv(string csvFilePath) { // 检查文件是否存在 if (!File.Exists(csvFilePath)) { Console.WriteLine("指定的CSV文件不存在"); return; } // 读取CSV全部内容 var fileLines = File.ReadAllLines(csvFilePath); if (fileLines.Length < 2) { Console.WriteLine("CSV文件无有效数据行"); return; } // 解析表头,匹配FirstName/LastName列的位置,兼容列顺序调整的场景,不硬编码列位置 var headerColumns = fileLines[0].Split(',').Select(col => col.Trim()).ToList(); int firstNameCol = headerColumns.IndexOf("FirstName"); int lastNameCol = headerColumns.IndexOf("LastName"); if (firstNameCol < 0 || lastNameCol <0) { Console.WriteLine("CSV文件缺少FirstName或LastName必填列"); return; } // 逐行处理数据 for (int lineIndex = 1; lineIndex < fileLines.Length; lineIndex++) { var currentRow = fileLines[lineIndex].Split(','); // 跳过空行/列数不足的无效行 if (currentRow.Length <= Math.Max(firstNameCol, lastNameCol)) { continue; } try { // 构造Person对象,和手动输入流程的对象结构完全一致 var person = new Person { FirstName = currentRow[firstNameCol].Trim(), LastName = currentRow[lastNameCol].Trim() }; // 复用已实现的合法性校验逻辑,不要在批量流程里重写校验规则 if (!ValidatePersonInfo(person)) { Console.WriteLine($"第{lineIndex+1}行校验不通过:{person.FirstName} {person.LastName}"); continue; } // 调用原有CreateUserName方法生成用户名 var userName = CreateUserName(person); Console.WriteLine($"处理完成:{person.LastName} {person.FirstName} -> {userName}"); } catch (Exception ex) { Console.WriteLine($"第{lineIndex+1}行处理失败:{ex.Message}"); } } } /// <summary> /// 复用原有手动输入阶段的人员信息校验逻辑,替换为之前实现的校验代码即可 /// </summary> private static bool ValidatePersonInfo(Person person) { // 示例规则,直接替换为现有校验逻辑 return !string.IsNullOrWhiteSpace(person.FirstName) && !string.IsNullOrWhiteSpace(person.LastName); }
使用说明
- 调用方式:直接传入CSV文件路径即可触发批量处理,示例:
BatchGenerateUserNameFromCsv("人员数据.csv") - CSV格式要求:第一行为表头,需包含
FirstName、LastName列,每一行对应一个人员的姓名数据 - 扩展性说明:
Person类没有和批量处理逻辑耦合,后续新增人员属性、对接其他业务流程时,可以直接复用模型,不需要修改批量处理的核心结构
内容的提问来源于stack exchange,提问作者zalky
相关产品推荐
相关产品推荐

