【问题标题】:How to convert specific column values to lowercase如何将特定列值转换为小写
【发布时间】:2021-10-13 02:17:21
【问题描述】:

我试图弄清楚 CsvHelper 在读取文件时是否可以操作 CSV 中的特定列值。

例如,根据以下设置,我希望始终以小写形式接收电子邮件值:

public class MyCsvEntity : ICsvEntity
{
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string DirectManager { get; set; }
    public Dictionary<string, string> DynamicColumns { get; set; }
}

映射:

public sealed class MyCsvMap : ClassMap<MyCsvEntity>
{
    public MyCsvMap()
    {
        Map(m => m.Email).Name("Email");
        Map(m => m.FirstName).Name("First Name");
        Map(m => m.LastName).Name("Last Name");
        Map(m => m.DirectManager).Name("Direct Manager");
    }
}

我尝试查找文档并寻找任何可以帮助我完成此任务的内置配置,但无济于事。目前,我正在读取 .csv 文件中的数据,并在其他地方执行ToLower()。如果有人知道如何使用 CsvHelper 完成此任务或提供任何见解,非常感谢。

【问题讨论】:

  • 不会有这样的工作:public string Email { get { return this.email; } set { this.email = value.ToLower(); } }?

标签: c# csvhelper


【解决方案1】:

我认为您应该能够为此使用Map 上的Convert 方法:

public sealed class MyCsvMap : ClassMap<MyCsvEntity>
{
    public MyCsvMap()
    {
        Map(m => m.Email).Name("Email").Convert(row => row.GetField("Email").ToLower());
        Map(m => m.FirstName).Name("First Name");
        Map(m => m.LastName).Name("Last Name");
        Map(m => m.DirectManager).Name("Direct Manager");
    }
}

【讨论】:

  • 请注意,如果您应用了多个名称,.GetField() 只会检查指定的名称。这意味着您必须在这种情况下使用 null-coalesce 或其他东西,例如 .Name("A").Name("B").Convert(row =&gt; (row.GetField("A") ?? row.GetField("B")).ToLower())(但我目前不确定 .GetField() 是否抛出或返回 null)。
  • @Oliver 不幸的是,如果缺少该标头,它确实会引发异常。我认为你必须做这样的事情。 .Name("A", "B").Convert(args =&gt; { args.Row.TryGetField("A", out string result); if (result == null) { args.Row.TryGetField("B", out result); } return result.ToLower(); });
  • 非常感谢,成功了!只是一个小笔记,我不得不这样写: Convert(args => args.Row.GetField("Email").ToLower());特定字段设置为必填,并且我已经在解析器中进行了安全检查,以确保该字段存在,所以我认为我不需要担心缺少标题。
猜你喜欢
  • 2021-10-15
  • 2022-01-03
  • 2012-11-13
  • 2019-04-25
  • 2018-04-21
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多