export-to-csv - 如何在使用 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 字符串,希望可以动态更改它。
解决方案
我认为创建自定义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);
}
}
推荐阅读
- python - Nifi:将深度嵌套的 xml 转换为 csv 的最快方法(ExecuteScript 与 ExecuteStreamCommand)
- javascript - 在 VueJS 中实现 JavaScript 类的正确方法
- php - 联系人在从数据库加入时消失
- javascript - 为什么使用 Multer 时 request.file 总是未定义?
- java - 在使用 bat 脚本更新 env 后,从 java 调用 GDAL 的可移植二进制文件时模块 osgeo(embd.py)的 ImportError。路径变量
- docker - 在 Windows 10 上重新启动 Docker 服务时丢失数据持久性
- discord.js - 让机器人为它所在的每个公会创建邀请
- c# - 如何分析 WaitHandle?
- .net-core - Azure Devops yaml dotnet core build /p:Version=1.2.3 始终默认为 csproj 中的版本
- javascript - 为什么 prop 在动态组件中没有反应性?