CsvHelper的ConvertUsing未改变输出

12

我正在尝试使用CsvHelper库(版本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文件:

我的代码使用这些内容创建了一个类的实例,然后将其写入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,但这也不起作用。

有任何想法我做错了什么吗?

2个回答

12

目前只有在读取时才使用ConvertUsing

如果您想自定义输出,可以使用自定义类型转换器。另外,您还可以通过类型转换器选项进行一些有限的设置。


1
那么,有人想在写入文件之前修改输出,该怎么做呢? - George Stocker
1
@GeorgeStocker 我在答案中添加了更多内容。 - Josh Close
1
这里有一个更简单的示例,演示如何使用自定义类型转换器将数据写入CSV文件:https://dev59.com/co3da4cB1Zd3GeqP4L4p#31817621 - Frederik Struck-Schøning

9

我有一个类似的需求,为了在保存到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的内容都会"通过"我的字符串规范化器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接