如何使用CSVHelper更新现有CSV文件中指定列的值?
实现方案
CSV为纯文本存储格式,本身不支持行级部分更新,使用CSVHelper实现仅修改指定列的标准流程为「读取全量CSV数据→仅修改目标列字段→全量回写覆盖原文件」,该流程不会改动其余列的原有数值。
操作步骤
- 第一步:定义和CSV列结构匹配的实体类,所有字段按CSV列映射,不需要修改的字段无需额外处理即可保留原值
- 第二步:用CSVHelper读取全量行数据到内存集合
- 第三步:匹配到需要更新的行,仅修改
ExecutionEndDate和ExecutionEndTime两个字段 - 第四步:将修改后的集合全量写回原CSV文件
代码示例
首先安装NuGet依赖:Install-Package CsvHelper
1. 定义映射实体类
using CsvHelper.Configuration.Attributes; public class ExecutionRecord { // 按你的CSV实际列名补充所有字段定义,不需要修改的字段仅定义即可 public int Id { get; set; } public string TaskName { get; set; } public string ExecutionStatus { get; set; } public string ExecutionStartDate { get; set; } public string ExecutionStartTime { get; set; } // 目标修改字段 public string ExecutionEndDate { get; set; } public string ExecutionEndTime { get; set; } // 其余CSV列按上述格式补充定义即可 }
2. 读写修改逻辑
using CsvHelper; using System.Globalization; using System.IO; using System.Linq; // 替换为你的CSV文件实际路径 var csvFilePath = @"C:\your\path\result.csv"; // 读取全量CSV数据 List<ExecutionRecord> allRecords; using (var reader = new StreamReader(csvFilePath)) using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture)) { allRecords = csvReader.GetRecords<ExecutionRecord>().ToList(); } // 匹配需要更新的行,此处以更新最后一行为例,可自定义匹配逻辑(如按任务ID、任务名称匹配) var targetRow = allRecords.LastOrDefault(); if (targetRow != null) { // 仅更新目标两列,其余列值保持不变 targetRow.ExecutionEndDate = DateTime.Now.ToString("yyyy/MM/dd"); targetRow.ExecutionEndTime = DateTime.Now.ToString("HH:mm:ss"); } // 回写覆盖原文件 using (var writer = new StreamWriter(csvFilePath)) using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csvWriter.WriteRecords(allRecords); }
注意事项
- 如果CSV列名和实体类属性名不一致,可给属性添加
[Name("CSV实际列名")]特性手动指定映射关系 - 需要批量更新多行时,遍历
allRecords集合匹配所有符合条件的行修改对应字段即可 - 操作前建议提前备份原CSV文件,避免逻辑错误导致数据丢失
内容的提问来源于stack exchange,提问作者Naseem
相关产品推荐
相关产品推荐

