使用C# CSVHelper读取CSV文件遇DateTime格式不识别错误如何解决
问题根因
- 读取CSV报DateTime解析错误:CSVHelper读写时使用的日期格式化规则不统一,写入的日期字符串格式与读取时默认的解析规则不匹配,无法完成字符串到DateTime类型的转换。
- 类型转换报错:
Proddeets类中TimeTaken属性为DateTime类型,你在SetTimeTaken方法中尝试将字符串类型的值直接赋值给该属性,C#作为强类型语言不支持该隐式转换操作。
修复方案
方案1:配置CSVHelper统一日期规则(推荐)
直接在CSVHelper的读写配置中指定固定的DateTime格式,无需修改实体类结构,是适配CSV读写场景的最优方案。
写入CSV代码示例
// 引入必要命名空间 using CsvHelper; using CsvHelper.Configuration; using System.Globalization; using System.IO; using System.Collections.Generic; // 全局配置,读写都用相同配置保证格式一致 var writeConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, DateTimeFormat = "dd-MM-yyyy" // 与你需要的日期格式保持一致 }; // 执行写入 using (var streamWriter = new StreamWriter("你的存储路径.csv")) using (var csvWriter = new CsvWriter(streamWriter, writeConfig)) { List<Proddeets> data = GetYourData(); // 替换为你的业务数据获取逻辑 csvWriter.WriteRecords(data); }
读取CSV代码示例
var readConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, DateTimeFormat = "dd-MM-yyyy" // 和写入配置完全一致 }; using (var streamReader = new StreamReader("你的文件路径.csv")) using (var csvReader = new CsvReader(streamReader, readConfig)) { List<Proddeets> result = csvReader.GetRecords<Proddeets>().ToList(); }
方案2:修改实体类的自定义赋值方法
如果你需要保留SetTimeTaken方法来设置默认时间,直接修正赋值逻辑即可,不需要做多余的字符串转换:
public class Proddeets { public string ProductArea { get; set; } public string Product { get; set; } // 可选:通过特性指定该属性的日期解析格式,无需额外配置CSVHelper [CsvHelper.Configuration.Attributes.Format("dd-MM-yyyy")] public DateTime TimeTaken{ get; set; } public void SetTimeTaken() { // 直接赋值DateTime类型的值,不需要转字符串 TimeTaken = DateTime.Today; } }
内容的提问来源于stack exchange,提问作者Aqiran
相关产品推荐
相关产品推荐

