CsvHelper ConvertUsing不改变输出

时间:2014-02-10 13:19:01

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

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

我已阅读有关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,但这也不起作用。

我出错的任何想法?

2 个答案:

答案 0 :(得分:11)

目前ConvertUsing仅在阅读时使用。

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

答案 1 :(得分:7)

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

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

WITH CteUnpivot(node, val, param) AS(
    SELECT node, Param1, 'Param1' FROM tbl UNION ALL
    SELECT node, Param2, 'Param2' FROM tbl UNION ALL
    SELECT node, Param3, 'Param3' FROM tbl UNION ALL
    SELECT node, Param4, 'Param4' FROM tbl UNION ALL
    SELECT node, Param5, 'Param5' FROM tbl
)
SELECT
    param,
    node1 = MAX(CASE WHEN node = 'node1' THEN val END),
    node2 = MAX(CASE WHEN node = 'node2' THEN val END),
    node3 = MAX(CASE WHEN node = 'node3' THEN val END),
    node4 = MAX(CASE WHEN node = 'node4' THEN val END),
    node5 = MAX(CASE WHEN node = 'node5' THEN val END)
FROM CteUnpivot
GROUP BY param

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

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";
        }
    }
}

因此保存到csv的所有内容都是“运行”我的字符串规范化程序。