CSVHelper — сопоставление одного класса с подклассами, но получение нескольких возвращаемых строк

Я пытаюсь использовать CsvHelper для анализа файла, в котором есть три горизонтальных раздела, в один вложенный класс С#. Я ожидал, что из файла будет возвращена одна строка, но я получаю несколько строк и неверные данные. Мое тестирование проводилось с файлом CSV, однако я получаю те же результаты, используя следующий код. Так разве нельзя выполнить эту задачу? Я видел другие сообщения, в которых я выполнял бы свои собственные циклы и чтение разделов, но я надеюсь, что вложенные классы С# будут работать. Он лучше соответствует требованиям.

Я уверен, что этот пример будет полезен другим.

Спасибо за помощь!

Майк

using System.IO;
using System.Linq;
using CsvHelper;
using CsvHelper.Configuration;

namespace CsvParserExample
{
    public class CsvParser
    {
        public static void Main()
        {
            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    using (var reader = new StreamReader(stream))
                        using (var csv = new CsvReader(reader))
                        {
                            // CsvFile.Name
                            writer.WriteLine("Mike,,");

                            // Section1.Id, Section2.Comment, Section2.Purpose
                            writer.WriteLine("1234,, I am a comment.,, I am a purpose.");
                            writer.Flush();
                            stream.Position = 0;

                            csv.Configuration.HasHeaderRecord = false;
                            csv.Configuration.RegisterClassMap<CsvFileMap>();
                            csv.Configuration.RegisterClassMap<Section1Map>();
                            csv.Configuration.RegisterClassMap<Section2Map>();
                            csv.Configuration.RegisterClassMap<Section3Map>();

                            var recs = csv.GetRecords<CsvFile>().ToList();
                        }
                }
            }
        }

        public class CsvFile
        {
            public Section1 Section1 { get; set; }

            public Section2 Section2 { get; set; }
        }

        public sealed class CsvFileMap : CsvClassMap<CsvFile>
        {
            public CsvFileMap()
            {                
                References<Section1Map>(m => m.Section1);
                References<Section2Map>(m => m.Section2);
            }
        }

        public class Section1
        {
            public string Name { get; set; }
        }

        public sealed class Section1Map : CsvClassMap<Section1>
        {
            public Section1Map()
            {
                Map(m => m.Name).Index(0);
            }
        }

        public class Section2
        {
            public string Id { get; set; }

            public Section3 Section3 { get; set; }
        }

        public sealed class Section2Map : CsvClassMap<Section2>
        {
            public Section2Map()
            {
                Map(m => m.Id).Index(0);
                References<Section3Map>(m => m.Section3);
            }
        }

        public class Section3
        {
            public string Comment { get; set; }

            public string Purpose { get; set; }
        }

        public sealed class Section3Map : CsvClassMap<Section3>
        {
            public Section3Map()
            {
                Map(m => m.Comment).Index(0);
                Map(m => m.Comment).Index(1);
            }        
        }
    }
}

person A Bit of Help    schedule 21.04.2017    source источник
comment
Здравствуйте, используется «читатель»: using (var csv = new CsvReader(reader)) :)   -  person A Bit of Help    schedule 21.04.2017
comment
@LeiYang он прав, reader используется для создания csv, а csv используется.   -  person grek40    schedule 21.04.2017
comment
Итак, я думаю, что понял это... Я изменил ситуацию... Я создал экземпляр CsvFile и использовал CsvHelper для записи экземпляра в файл CSV. Результат разумный, но это не то, что я ожидал:   -  person A Bit of Help    schedule 21.04.2017
comment
Содержимое созданного файла: Mikie,54321,я новый комментарий. Таким образом, все поля класса и ссылочные классы помещаются в одну строку, то есть в одну запись. Я ожидал, что он будет отображать класс по нескольким строкам, которые представляют разделы моего класса. Итак, похоже, что ручной синтаксический анализ — это путь.   -  person A Bit of Help    schedule 21.04.2017


Ответы (1)


Итак, я думаю, что понял это... Я изменил ситуацию... Я создал экземпляр CsvFile и использовал CsvHelper для записи экземпляра в файл CSV. Результат разумный, но это не то, что я ожидал.

Содержимое созданного файла: Mikie, 54321, я новый комментарий. Таким образом, он помещает все поля в классе и ссылочные классы в одну строку, то есть в одну запись. Я ожидал, что он будет отображать класс по нескольким строкам, которые представляют разделы моего класса. Итак, похоже, что ручной синтаксический анализ — это путь.

person A Bit of Help    schedule 21.04.2017