вопрос с использованием должен цитировать в CsvHelper - PullRequest
0 голосов
/ 13 апреля 2019

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

Я знаю, что мне нужно обновить опцию 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, "12/12/2019 14:11:40", "two" ,, 90, False

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

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

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

var indexes = new[] { 2, 3, 4 };
csv.Configuration.ShouldQuote = (field, context) => indexes.Contains(context.Record.Count) && !string.IsNullOrEmpty(field);
0 голосов
/ 13 апреля 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}"); 
    ....} 

`

...