C# 按Id列替换CSV指定行时其余内容丢失如何解决
问题根因分析
- 写文件逻辑错误:最后调用
File.WriteAllText时仅传入了replacedLine单条替换后的行,直接覆盖了整个CSV文件,自然丢失了其余所有行 - 循环逻辑错误:匹配到目标Id后
replacedLine被赋值不为空,后续所有行的解析都会强制用替换后的行拆分,导致返回的listInvoices里除了匹配行之前的条目,后面全是重复的替换行数据
修正后可运行代码
public static IEnumerable<Invoice> Replace(int Id, string invoice) { var lines = File.ReadAllLines("Invoices.csv"); var processedLines = new List<string>(); // 存储所有处理后的行 var listInvoices = new List<Invoice>(); foreach (var line in lines) { var currentLine = line; var value = currentLine.Split(";"); // 仅当前行匹配目标Id时执行替换 if (Int32.Parse(value[1]) == Id) { currentLine = invoice; value = currentLine.Split(";"); } // 构造返回的Invoice对象 var invoice1 = new Invoice() { DateAndTimeCreation = value[0], Id = Int32.Parse(value[1]), Status = GetStatus(value[2]), Amount = Decimal.Parse(value[3]), PaymentMethod = GetPayment(value[4]) }; listInvoices.Add(invoice1); processedLines.Add(currentLine); // 存入处理后的行 } // 全量写回所有处理后的行,保留原有未匹配内容 File.WriteAllLines("Invoices.csv", processedLines); return listInvoices; }
注意事项
- 如果CSV包含表头,需要跳过第一行再做Id匹配,避免解析报错
- 建议补充异常判断逻辑:比如行拆分后字段数不足、Id解析失败的场景,避免运行时崩溃
- 10行级别的小文件用
ReadAllLines完全没问题,处理GB级大文件时建议改用流式读写降低内存占用
内容的提问来源于stack exchange,提问作者Кирилл Филободченко
相关产品推荐
相关产品推荐

