【问题标题】:CsvHelper ConvertUsing not changing outputCsvHelper ConvertUsing 不改变输出
【发布时间】:2014-03-07 20:29:31
【问题描述】:

我正在尝试使用 CsvHelper 库 (v 2.4.0) 的 ConvertUsing 方法。

我已阅读有关 ConvertUsing 的文档,但无法使用它。

我正在使用一个简单的类:

public class Test
{
    public long Id { get; set; }
    public string Title { get; set; }
}

有了这个ClassMap

public class TestClassMap : CsvClassMap<Test>
{
    public override void CreateMap()
    {
        Map(m => m.Id).Name("id").ConvertUsing(row => 11111);
        Map(m => m.Title).Name("title").ConvertUsing(row => row.GetField("title") + " 123");
    }
}

我使用这些的代码创建了一个类的实例,然后将其写入 CSV:

var test = new Test() { Id = 99, Title = "Test title" };

using (var streamWriter = new StreamWriter("test.csv"))
{
    var csv = new CsvWriter(streamWriter);
    csv.Configuration.RegisterClassMap<TestClassMap>();
    csv.WriteRecord(test);
}

但是输出文件test.csv 始终是以下格式:

id,title
99,Test title

我正在寻找的输出是:

id,title
11111,Test title 123

ConvertUsing 被忽略。我试过只转换Id,只转换Title,但这也不起作用。

任何想法我哪里出错了?

【问题讨论】:

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


    【解决方案1】:

    目前ConvertUsing只在阅读时使用。

    如果要自定义输出,可以使用自定义类型转换器。您还可以通过类型转换器选项获得一些有限的能力。

    【讨论】:

    • 那么在写入文件之前有人会如何修改输出?
    • @GeorgeStocker 我在答案中添加了更多内容。
    • 这里有一个使用自定义类型转换器写入 csv 的简单(r)示例:stackoverflow.com/a/31817621/430885
    【解决方案2】:

    我有类似的需求,这是我为了在将内容保存到 csv 文件之前修改内容而做的。

    我有一个名为 StringNormalizer 的自定义类,它实现了 CsvHelper.TypeConversion.ITypeConverter 接口。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using CsvHelper.TypeConversion;
    
    namespace MyNamespaceInHere {    
        public class StringNormalizer : ITypeConverter {
            public bool CanConvertFrom(Type type) {
                if (type == typeof(string)) return true;
                return false;
            }
            public bool CanConvertTo(Type type) {
                if (type == typeof(string)) return true;
                return false;
            }
            public object ConvertFromString(TypeConverterOptions options, string text) { return normalize(text); }
            public string ConvertToString(TypeConverterOptions options, object value) {
                if (value == null) return string.Empty;
                if (value.GetType() == typeof(string)) {
                    string str = (string)value;
                    return normalize(str);
                }
                return string.Empty;
            }
            public string normalize(string field) {
                // Do stuff in here and return normalized string
                return field + " just a sample";
            }
        }
    }
    

    然后在我定义映射的主程序中,我像这样使用它

    public sealed class ConMap : CsvClassMap<Contact> {        
            public override void CreateMap() {
                Map(m => m.FirstName).Name("FirstName").TypeConverter<StringNormalizer>();
            }
        }
    

    因此保存到 csv 的所有内容都“贯穿”了我的字符串规范化器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多