проблема с использованием должна цитироваться в CsvHelper

У меня возникла проблема с использованием библиотеки csvHelper. Я прикрепил свой объект класса. Я хочу, чтобы вводились только данные типа string и dateTime.

Я знаю, что мне нужно обновить параметр 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», «12.04.2019 14:11:40», «два», «», 90, ложь

100 цитируется, поскольку я установил return context.Record.Count == 1; Но мой ожидаемый результат

74d5c276-0e5f-442b-a392-cd8fb37c4114,100, «4/12/2019 2:11:40 PM», «два», 90, ложь

в ожидаемом результате в виде строки Электронная почта не указана, поэтому я хочу, чтобы это было так ("два" ,, 90 вместо "два", "", 90)


person user2026934    schedule 12.04.2019    source источник


Ответы (2)


Ваш ответ, возможно, легче читать, но на всякий случай вы захотите использовать ShouldQuote. Я обнаружил, что Джош Клоуз показал , как цитировать определенные индексы. Удалите операторы ConvertUsing() в ClassMap и установите ShouldQuote следующим образом.

var indexes = new[] { 2, 3, 4 };
csv.Configuration.ShouldQuote = (field, context) => indexes.Contains(context.Record.Count) && !string.IsNullOrEmpty(field);
person David Specht    schedule 13.04.2019
comment
Спасибо, Дэвид. Это решение однозначно лучше моего. - person user2026934; 15.04.2019

Обновлены коды следующим образом:

`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}"); 
    ....} 

`

person user2026934    schedule 12.04.2019