c# - 在 CsvHelper 中使用应该引用的问题

标签 c# quote csvhelper

我在使用 csvHelper 库时遇到了一些问题。我附上了我的类(class)对象。我希望仅引用字符串和日期时间类型的数据。

我知道我需要更新 csv.Configuration.ShouldQuote 选项。但不知道如何。

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

目前我得到的结果是

74d5c276-0e5f-442b-a392-cd8fb37c4114,"100","4/12/2019 2:11:40 PM","two","",90,False

100 在我设置 return context.Record.Count == 1 时被引用;但是我的预期结果是

74d5c276-0e5f-442b-a392-cd8fb37c4114,100,"4/12/2019 2:11:40 PM","two",,90,False

在预期的结果中,因为没有提供字符串电子邮件,所以我希望它像("two",,90 而不是 "two","",90)

最佳答案

您的答案可能更易于阅读,但以防万一您想使用 ShouldQuote。我找到了 Josh Close 展示的地方 how to quote specific indexes .删除 ClassMap 中的 ConvertUsing() 语句并像这样设置 ShouldQuote

var indexes = new[] { 2, 3, 4 };
csv.Configuration.ShouldQuote = (field, context) => indexes.Contains(context.Record.Count) && !string.IsNullOrEmpty(field);

关于c# - 在 CsvHelper 中使用应该引用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55659704/

相关文章:

c# - 免费开放在线项目?

mysql - mysql导入时自动生成的引号

sql - postgresql:在标题上强制引号

c# - 新版本的 CsvHelper 中的 IWriterConfiguration.ReferenceHeaderPrefix 等效项

asp.net-mvc - 使用 CSV Helper 解析时未找到任何 header 记录

c# - 无法使用 nuget 安装 PCLStorage

c# - 并发网络请求性能问题

c# - 将 CSV 文件读取到嵌套对象

c# - 如何在 C# 中从给定 IP 获取域名?