C# 在CsvHelper中使用应报价的问题
我在使用csvHelper库时遇到了一些问题。我已经附加了我的类对象。我希望字符串和日期时间类型的数据将只引用 我知道我需要更新csv.Configuration.ShouldQuote选项。但我不知道怎么做C# 在CsvHelper中使用应报价的问题,c#,quote,csvhelper,C#,Quote,Csvhelper,我在使用csvHelper库时遇到了一些问题。我已经附加了我的类对象。我希望字符串和日期时间类型的数据将只引用 我知道我需要更新csv.Configuration.ShouldQuote选项。但我不知道怎么做 static void Main() { var recordNew = new List<Metadata> { new Metadata { Id = Guid.
static void Main()
{
var recordNew = new List<Metadata>
{
new Metadata { Id = Guid.NewGuid(), VersionNumber = 100, CreatedOn=DateTime.Now, Name = "two", AccountSequene=90, IsPublic=false}
};
writeDataTest(recordNew);
}
private static void writeDataTest(List<Metadata> records)
{
using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer))
{
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.ShouldQuote = (field, context) =>
{
return context.Record.Count == 1;
};
csv.Configuration.RegisterClassMap<MetadataMap>();
csv.WriteRecords(records);
var s = writer.ToString();
}
}
public class Metadata
{
public Guid? Id { get; set; }
public long? VersionNumber { get; set; }
public DateTime? CreatedOn { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public long? AccountSequene { get; set; }
public bool? IsPublic { get; set; }
}
public class MetadataMap : ClassMap<Metadata>
{
public MetadataMap()
{
Map(m => m.Id).Index(0);
Map(m => m.VersionNumber).Index(1);
Map(m => m.CreatedOn).Index(2).ConvertUsing(m => $"\"{m.CreatedOn}\"");
Map(m => m.Name).Index(3).ConvertUsing(m => $"\"{m.Name}\"");
Map(m => m.Email).Index(4).ConvertUsing(m => $"\"{m.Email}\"");
Map(m => m.AccountSequene).Index(5);
Map(m => m.IsPublic).Index(6);
}
}
static void Main()
{
var recordNew=新列表
{
新元数据{Id=Guid.NewGuid(),VersionNumber=100,CreatedOn=DateTime.Now,Name=“two”,AccountSequene=90,IsPublic=false}
};
书面状态(记录新);
}
私有静态void writeDateTest(列出记录)
{
使用(var writer=new StringWriter())
使用(var csv=新csv编写器(编写器))
{
csv.Configuration.HasHeaderRecord=false;
csv.Configuration.ShouldQuote=(字段,上下文)=>
{
返回context.Record.Count==1;
};
csv.Configuration.RegisterClassMap();
csv.书面记录(记录);
var s=writer.ToString();
}
}
公共类元数据
{
公共Guid?Id{get;set;}
公共长版本?版本号{get;set;}
公共日期时间?CreatedOn{get;set;}
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
公共长?AccountSequene{get;set;}
公共bool?IsPublic{get;set;}
}
公共类MetadataMap:ClassMap
{
公共元数据映射()
{
Map(m=>m.Id).Index(0);
Map(m=>m.VersionNumber).Index(1);
Map(m=>m.CreatedOn).Index(2).ConvertUsing(m=>$“\”{m.CreatedOn}\”);
Map(m=>m.Name).Index(3).ConvertUsing(m=>$“\{m.Name}\”);
Map(m=>m.Email).Index(4).ConvertUsing(m=>$“\”{m.Email}\”);
Map(m=>m.AccountSequene)指数(5);
地图(m=>m.IsPublic)。指数(6);
}
}
目前我得到的结果如下
74d5c276-0e5f-442b-a392-cd8fb37c4114,“100”,“2019年12月4日下午2:11:40”,“两个”,“90”,假
100被引用为I set return context.Record.Count==1;但我的预期结果是
74d5c276-0e5f-442b-a392-CD8FB37C4114100,“2019年4月12日下午2:11:40”,“两个”,90,假
在预期结果中,由于未提供字符串电子邮件,因此我希望类似(“两个”、“90”而不是“两个”、“90”)更新代码如下:
`private static void writeDataTest(List<Metadata> records)
{
......
csv.Configuration.ShouldQuote = (field, context) =>
{
return false;
};
......
}
public class MetadataMap : ClassMap<Metadata>
{ .....
Map(m => m.Email).Index(4).ConvertUsing(m => m.Email != null ? $"\"{m.Email}\"" : $"{m.Email}");
....}
`private static void writeDataTest(列出记录)
{
......
csv.Configuration.ShouldQuote=(字段,上下文)=>
{
返回false;
};
......
}
公共类MetadataMap:ClassMap
{ .....
Map(m=>m.Email).Index(4).ConvertUsing(m=>m.Email!=null?$“\”{m.Email}\:$”{m.Email}”);
....}
`您的答案可能更容易阅读,但只是为了防止您想使用
应该引用。我找到了Josh Close展示的地方。删除类映射中的ConvertUsing()
语句,然后像这样设置ShouldQuote
var索引=new[]{2,3,4};
csv.Configuration.ShouldQuote=(字段,上下文)=>index.Contains(context.Record.Count)&&!string.IsNullOrEmpty(字段);
谢谢,大卫。这个解决方案肯定比我的好。