You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CSVHelper在C#中按ID关联并合并两个CSV文件

使用CSVHelper在C#中基于ID补全CSV缺失信息

实现步骤

  1. 定义实体类
    对应两个CSV文件的结构以及最终合并后的结果结构,用[Name]特性匹配CSV列名,确保字段映射准确。

  2. 构建位置信息字典
    先读取project2.csv,将ID作为键、Location作为值存入字典,后续匹配时可快速查找对应位置。

  3. 读取并补全主数据
    读取project1.csv的每一条记录,通过ID匹配字典中的位置信息,补全缺失的Location字段。

  4. 写入结果文件
    将补全后的列表写入新的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:10:34