从一个 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; }
}
我偶然发现了一个问题,我在 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; }
}