如何将CommandLine参数传入CsvHelper的DataMap索引中?
动态通过命令行参数配置CsvHelper的DataMap索引
我当前的CsvHelper映射代码如下,由于CSV文件的列位置可能发生变化,希望将CommandLineParse库解析的命令行参数传入DataMap,以此动态配置字段对应的索引:
public class CSVData { public string? FName { get; set; } public string? LName { get; set; } } public sealed class DataMap : ClassMap<CSVData> { public DataMap() { Map(m => m.FName).Index(0); Map(m => m.LName).Index(1); } }
我的命令行参数配置类代码:
using CommandLine; namespace CommandLineParsing { public class CommandLineOptions { [Option(shortName: 'f', longName: "firstName", Required = true)] public int firstName { get; set; } [Option(shortName: 'l', longName: "lastName", Required = true)] public int lastName { get; set; } } }
解决方法
1. 修改DataMap构造函数,接收命令行参数
将DataMap的无参构造改为带CommandLineOptions参数的构造,直接用传入的参数设置字段索引:
public sealed class DataMap : ClassMap<CSVData> { public DataMap(CommandLineOptions options) { Map(m => m.FName).Index(options.firstName); Map(m => m.LName).Index(options.lastName); } }
2. 在主程序中解析命令行并初始化DataMap
在控制台程序入口处,先完成命令行参数解析,再用解析后的参数创建DataMap实例并注册到CsvHelper配置中:
using CommandLine; using CsvHelper; using CsvHelper.Configuration; using System.Globalization; class Program { static void Main(string[] args) { // 解析命令行参数 Parser.Default.ParseArguments<CommandLineOptions>(args) .WithParsed(options => { // 创建CSV配置并注册自定义DataMap var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, // 根据你的CSV实际情况调整该值 }; config.RegisterClassMap(new DataMap(options)); // 读取CSV示例代码 using (var reader = new StreamReader("target-file.csv")) using (var csv = new CsvReader(reader, config)) { var records = csv.GetRecords<CSVData>().ToList(); // 在这里处理读取到的数据 } }) .WithNotParsed(errors => { // 处理参数解析失败的场景 foreach (var error in errors) { Console.WriteLine(error.ToString()); } }); } }
3. 运行程序时传入命令行参数
启动程序时通过命令行指定对应列的索引,示例:
your-app.exe -f 2 -l 3
或者使用长参数格式:
your-app.exe --firstName 2 --lastName 3
这样就能根据每次运行时传入的参数,动态调整CSV字段与实体属性的索引映射,适配不同结构的CSV文件。
内容的提问来源于stack exchange,提问作者Blade
相关产品推荐
相关产品推荐

