【问题标题】:Add dummy empty fields in CSVHelper在 CSVHelper 中添加虚拟空字段
【发布时间】:2014-11-05 20:08:12
【问题描述】:

我使用库 CsvHelper 来编写 CSV。我有一个不包含所有记录的对象,我必须在我的 CSV 中添加空字段。例如:

public class Example
{
   public string Test1 { get; set; }
   public string Test2 { get; set; }
}

有了这张地图:

public class ExampleMap : ClassMap<Example>
{
    public ExampleMap()
    {
      Map(ex=>ex.Test1).Index(0);
      Map(ex=>ex.Test2).Index(4);
    }
}

我想拥有这个对象

new Example() { Test1="dummy", Test2="field" };

这个 csv 结果:

dummy;;;field

如果有人可以帮助我,我真的很难解决这个问题:) 非常感谢

【问题讨论】:

    标签: c# .net csv export-to-csv csvhelper


    【解决方案1】:

    似乎违反了在它们之间有显式列映射的概念。

    CsvHelper 库似乎不支持这种情况,因为the library simply uses indices in ascending order 用于定义的列映射(“映射列”)。

    但是,如果确实需要有这样的输出,可以如下引入“未使用”(保留)列:

    internal sealed class Example
    {
        public string Test1 { get; set; }
        public string Test2 { get; set; }
    
        public string Reserved1 { get; set; }
        public string Reserved2 { get; set; }
    }
    
    internal sealed class ExampleMap : CsvClassMap<Example>
    {
        public ExampleMap()
        {
            Map(ex => ex.Test1).Index(0);
            Map(ex => ex.Reserved1).Index(1);
            Map(ex => ex.Reserved2).Index(2);
            Map(ex => ex.Test2).Index(3);
        }
    }
    

    【讨论】:

    • 这对我的案例来说将是一个巨大的浪费时间(我的一个 csv 中有 100 个空白字段)(我重写了一个使用空白字段管理的旧 EDI...!)而且我尝试了很多(愚蠢的)事情(在 PropertyMap 中添加虚拟 PropertyInfo,注册相同的虚拟属性......)。我考虑编辑 csvhelper 的核心来解决我的问题! (我看过你的博客,很好!)
    • CSV 文件开头是否有字段名称?
    • 没有标题,只有数据!
    • 这很有趣。需要有关什么是输入数据结构(它不应该是两个属性?)以及 CSV 文件的外观(更接近“真实世界”)的更多详细信息。附言谢谢!很高兴你喜欢这个博客。 =)
    • 真实世界的结构是混合数据(日期、序列号、编码状态等),并且有很多变化(10 个文件,具有 5 到 50 个属性,映射到我们这边的数据库和其他任何地方)在我们的合作伙伴方面),我写了很多转换器,这些转换器在旧应用程序中被肮脏地管理,除了“空白字段”之外,使用 csvhelper 结构看起来更“处理得好”。(对不起我的英语,这不是我的母语!)
    【解决方案2】:

    我终于选择直接编辑每一行的最终 csv 字符串......它可以工作,但它很难看!

    【讨论】:

      【解决方案3】:

      注意:在较新的版本中,这可能会被 Constant() 运算符取代。

      更符合 API 的方法可能是使用自定义 ITypeConverter。以下是我的使用方法:

      Map(i => i.SomeUnusedId).Name("SomeId").TypeConverter<EmptyConverter>(); //converst to an empty string
      

      那么转换器可能看起来像这样:

      public class EmptyConverter : ITypeConverter {
          /// <inheritdoc />
          public bool CanConvertFrom(Type type) {
              return true;
          }
      
          /// <inheritdoc />
          public bool CanConvertTo(Type type) {
              return true;
          }
      
          /// <inheritdoc />
          public object ConvertFromString(TypeConverterOptions options, string text) {
              return string.Empty;
          }
      
          /// <inheritdoc />
          public string ConvertToString(TypeConverterOptions options, object value) {
              return string.Empty;
          }
      }
      

      【讨论】:

        【解决方案4】:

        使用常量值定义 ClassMap 中的字段将允许您定义空列。这将生成带有标题的所需输出。

        public class ExampleMap: ClassMap<Example>
        {
             public ExampleMap()
             {
                 Map(ex=>ex.Test1).Index(0).Name("Test1");
                 Map().Index(1).Name("First Empty Column").Constant("");
                 Map().Index(2).Name("Second Empty Column").Constant("");
                 Map().Index(3).Name("Third Empty Column").Constant("");
                 Map(ex=>ex.Test2).Index(4).Name("Test2");
             } 
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-12
          • 2022-07-07
          • 1970-01-01
          • 2022-12-01
          • 1970-01-01
          • 2019-09-19
          • 1970-01-01
          相关资源
          最近更新 更多