如何使用CSVHelper在C#中按ID关联并合并两个CSV文件
使用CSVHelper在C#中基于ID补全CSV缺失信息
实现步骤
定义实体类
对应两个CSV文件的结构以及最终合并后的结果结构,用[Name]特性匹配CSV列名,确保字段映射准确。构建位置信息字典
先读取project2.csv,将ID作为键、Location作为值存入字典,后续匹配时可快速查找对应位置。读取并补全主数据
读取project1.csv的每一条记录,通过ID匹配字典中的位置信息,补全缺失的Location字段。写入结果文件
将补全后的列表写入新的CSV文件,得到最终合并结果。
完整代码示例
首先确保已通过NuGet安装CsvHelper包。
using CsvHelper; using CsvHelper.Configuration; using System.Collections.Generic; using System.Globalization; using System.IO; // 定义实体类,匹配CSV列名 public class ProjectItem { [Name("SN")] public int SN { get; set; } [Name("ID")] public int ID { get; set; } [Name("Name")] public string Name { get; set; } [Name("Location")] public string Location { get; set; } } public class ProjectLocation { [Name("ID")] public int ID { get; set; } [Name("Location")] public string Location { get; set; } } class Program { static void Main(string[] args) { // 配置CSV读取规则:空格分隔、自动修剪表头和字段、忽略空行 var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = " ", TrimHeaders = true, TrimFields = true, IgnoreBlankLines = true }; // 读取project2.csv,构建ID-Location字典 var locationMap = new Dictionary<int, string>(); using (var reader = new StreamReader("project2.csv")) using (var csvReader = new CsvReader(reader, csvConfig)) { foreach (var location in csvReader.GetRecords<ProjectLocation>()) { locationMap[location.ID] = location.Location; } } // 读取project1.csv并补全Location var mergedProjects = new List<ProjectItem>(); using (var reader = new StreamReader("project1.csv")) using (var csvReader = new CsvReader(reader, csvConfig)) { foreach (var project in csvReader.GetRecords<ProjectItem>()) { // 匹配到ID则补全位置,否则保持为空 if (locationMap.TryGetValue(project.ID, out var location)) { project.Location = location; } mergedProjects.Add(project); } } // 将结果写入新CSV文件 using (var writer = new StreamWriter("result.csv")) using (var csvWriter = new CsvWriter(writer, csvConfig)) { csvWriter.WriteRecords(mergedProjects); } } }
关键说明
- 分隔符配置:示例中CSV使用空格分隔,因此设置
Delimiter = " ";如果你的CSV是逗号分隔,可移除该配置。 - 空值处理:当project1中的ID在project2中不存在时,Location字段会保留为
null,写入CSV时会显示为空,符合需求。 - 文化兼容性:使用
CultureInfo.InvariantCulture避免因系统区域设置导致的数值解析错误。
内容的提问来源于stack exchange,提问作者Nirakar Nepal
相关产品推荐
相关产品推荐

