12

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が、これも機能しません。

私が間違っているアイデアはありますか?

4

2 に答える 2

12

現在ConvertUsing、読み取り時にのみ使用されます。

出力をカスタマイズする場合は、カスタム型コンバーターを使用できます。また、タイプ コンバーター オプションを使用すると、いくつかの機能が制限されます。

于 2014-04-10T20:26:35.510 に答える
9

同様のニーズがありました.csvファイルに保存する前にコンテンツを変更するために作成したものです.

CsvHelper.TypeConversion.ITypeConverter インターフェイスを実装する StringNormalizer というカスタム クラスがあります。

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に保存されるものはすべて、文字列ノーマライザーを「実行」します。

于 2015-06-30T12:44:56.527 に答える