首页 > 解决方案 > 如何在使用 CsvHelper 写入 csv 字符串/文件的过程中替换字符/符号?

问题描述

CsvHelper.CsvWriter.Configuration在写入 csv 字符串的过程中,我需要从一行中的每一列中删除一些符号,但我在其他地方或CsvHelper.CsvWriter.Context其他地方都找不到这样的功能。

作为我可以接受的解决方法,我尝试覆盖ConvertUsing类的方法,MemberMap<TClass, TMember>但它不能正常工作:

 public class CustomMemberMap < TClass, TMember >: MemberMap < TClass, TMember > {
     public CustomMemberMap(MemberInfo member): base(member) {}

     public override MemberMap < TClass, TMember > ConvertUsing(Func < TClass, string > convertExpression) => base.ConvertUsing(row => convertExpression(row).Replace("\r", "").Replace("\n", ""));
 }

 public class CustomClassMap < TClass >: ClassMap < TClass > where TClass: new() {
     public override MemberMap < TClass, TMember > Map < TMember > (Expression < Func < TClass, TMember >> expression, bool useExistingMap = true) => new CustomMemberMap < TClass, TMember > (base.Map(expression, useExistingMap).Data.Member);
 }

 public sealed class CsvFileMapperAccommodation: CustomClassMap < Accommodation > {
     public CsvFileMapperAccommodation() {
         Map(m => m.Name).Name($ "AccommodationName").ConvertUsing(x => $ "{x.Name}");
         Map(m => m.ExternalKey).Name($ "AccommodationExternalKey").ConvertUsing(x => $ "{x.ExternalKey}");
         Map(m => m.Pension).Name($ "AccommodationPension").ConvertUsing(x => $ "{x.Pension}");
         Map(m => m.Category).Name($ "AccommodationCategory").ConvertUsing(x => $ "{x.Category}");
         Map(m => m.BuyingPrice).Name($ "AccommodationBuyingPrice").ConvertUsing(x => $ "{x.BuyingPrice}");
         Map(m => m.Margin).Name($ "AccommodationMargin").ConvertUsing(x => $ "{x.Margin}");
         Map(m => m.Price).Name($ "AccommodationPrice").ConvertUsing(x => $ "{x.Price}");
         Map(m => m.Quantity).Name($ "AccommodationQuantity").ConvertUsing(x => $ "{x.Quantity}");
         Map(m => m.Supplier).Name($ "AccommodationSupplier").ConvertUsing(x => $ "{x.Supplier}");
     }
 }

该对象(我尝试映射)包含很多属性,因此在输出中我每行大约有 300 个字段,因此,手动更改开头的对象数据和每个字段的值太复杂且不优雅最后的领域。所以我只尝试将此对象映射到一个 csv 字符串,希望可以动态更改它。

标签: export-to-csvcsvhelper

解决方案


我认为创建自定义StringConverter可能会满足您的需求。

public class Program
{
    public static void Main(string[] args)
    {    
        var records = new List<Foo>()
        {
            new Foo {Property1 = "Property 1 with \r\n \\r\\n", Property2 = "Property2 with \n \\n"}
        };

        using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
        {
            csv.Configuration.TypeConverterCache.AddConverter<string>(new FooStringConverter());

            csv.WriteRecords(records);
        }

        Console.ReadKey();
    }
}

public class Foo
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

public class FooStringConverter: StringConverter
{
    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        var stringValue = (string)value;

        if (stringValue != null)
        {
            stringValue = stringValue.Replace("\r", "").Replace("\n", "");
        }

        return base.ConvertToString(stringValue, row, memberMapData);
    }
}

推荐阅读