从一个 csv 文件中获取一行以在不同的 csv 文件中搜索匹配的行

Fetching a row from one csv file to search for a matching row in a different csv file

我偶然发现了一个问题,我在 CSVhelper 的帮助下生成了一个 csv 文件。该文件包含 2 列(时间戳和 ID)。我现在想打开一个包含 ID 和这些 ID 的描述的不同 CSV 文件,并将描述导入另一个 CSV 文件以匹配 ID 和描述。

但是我还没有找到关于如何执行此操作的任何信息。并想知道是否有任何流畅的方式来执行此操作。

编辑:

澄清一下:我有一个 CSV 文件,其中包含与此类似的不同事件:

17/05/2022 16.28, 2 
17/05/2022 16.28, 3 

其中 1、2、3 和 4 代表已发生事件的 ID。我想从另一个 CSV 文件中获取 ID 的描述。看起来像这样:

1, problem 1
2, problem 2
3, problem 3
4, problem 4

所以我想获取 ID 2 和 3 的描述并将其插入到 ID 旁边,这样最终结果将如下所示:

17/05/2022 16.28, 2, problem 2
17/05/2022 16.28, 3, problem 3

@Peter Smith 的想法是正确的。像这样的东西应该有用。

void Main()
{
    List<Foo> records;

    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        HasHeaderRecord = false
    };

    using (var reader = new StreamReader("path\to\file.csv"))
    using (var csv = new CsvReader(reader, config))
    {
        var options = new TypeConverterOptions { Formats = new[] { "dd/MM/yyyy mm.ss" } };

        csv.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
        
        csv.Context.RegisterClassMap<FooMap>();

        records = csv.GetRecords<Foo>().ToList();
    }

    using (var reader = new StreamReader("path\to\descriptions.csv"))
    using (var csv = new CsvReader(reader, config))
    {
        var descriptions = csv.GetRecords<dynamic>().ToList();

        records = records.Join(
            descriptions, 
            record => record.Id, 
            description => description.Field1, 
            (record, description) => { record.Description = description.Field2; return record; }).ToList();
    }
    
    using (var writer = new StreamWriter("path\to\file.csv"))
    using (var csv = new CsvWriter(writer, config))
    {
        var options = new TypeConverterOptions { Formats = new[] { "dd/MM/yyyy mm.ss" } };

        csv.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
        
        csv.WriteRecords(records);
    }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap() 
    {
        Map(x => x.Id).Index(1);
        Map(x => x.Timestamp).Index(0);
    }
}

public class Foo
{
    [Index(1)]
    public string Id { get; set; }
    [Index(0)]
    public DateTime Timestamp { get; set; }
    [Index(2)]
    public string Description { get; set; }
}