如何使用CsvHelper解决横向存储价格CSV的字段映射转换问题
你需要的是宽表转长表的实现,用CsvHelper可以按如下方式实现:
第一步:定义输出结果的实体类
public class ProductPrice { public string ArticleNumber { get; set; } public string Shop { get; set; } public decimal Price { get; set; } }
第二步:安装CsvHelper并编写转换逻辑
先通过NuGet安装CsvHelper包,再使用以下代码完成读取转换:
using CsvHelper; using CsvHelper.Configuration; using System.Globalization; using System.IO; using System.Linq; using System.Collections.Generic; // 初始化Csv配置,适配你的分号分隔格式 var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = ";", HasHeaderRecord = true }; var outputList = new List<ProductPrice>(); // 读取并转换CSV using (var streamReader = new StreamReader("你的CSV文件本地路径.csv")) using (var csvReader = new CsvReader(streamReader, csvConfig)) { // 读取表头 csvReader.Read(); csvReader.ReadHeader(); // 筛选出所有门店列 var allShopColumns = csvReader.HeaderRecord.Where(col => col.StartsWith("Shop")).ToList(); // 遍历每一行商品数据 while (csvReader.Read()) { var currentArticleNo = csvReader.GetField<string>("ArticleNumber"); // 遍历所有门店生成对应记录 foreach (var shopName in allShopColumns) { outputList.Add(new ProductPrice { ArticleNumber = currentArticleNo, Shop = shopName, Price = csvReader.GetField<decimal>(shopName) }); } } }
最终outputList中存储的就是你需要的三字段结构数据,可直接用于后续业务处理。该方案采用动态读取门店列的逻辑,兼容性更好,后续新增/减少门店字段无需修改代码即可自动适配。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

