【问题标题】:CSVHelper - Mapped single class with subclasses, but getting multiple rows returnedCSVHelper - 使用子类映射单个类,但返回多行
【发布时间】:2017-04-21 02:07:46
【问题描述】:

我正在尝试使用 CsvHelper 将包含三个水平部分的文件解析为单个嵌套的 C# 类。我希望从文件中返回一行,但我得到了多行和不正确的数据。我的测试是使用 CSV 文件进行的,但是我使用以下代码得到了相同的结果。那么,是不是不能完成这个任务呢?我看过其他帖子,我会自己循环和阅读这些部分,但我希望嵌套的 C# 类能够工作。它更符合要求。

我相信这个例子会对其他人有所帮助。

感谢您的帮助!

迈克

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

【问题讨论】:

  • 您好,正在使用“阅读器”:“使用 (var csv = new CsvReader(reader))”:)
  • @LeiYang 他是对的,reader 用于创建csvcsv 用于。
  • 好的,所以我想我已经想通了...我扭转了局面...我创建了一个 CsvFile 实例并使用 CsvHelper 将该实例写入 CSV 文件。结果是明智的,但这不是我所期望的:
  • 创建的文件内容:Mikie,54321,我是新评论。因此,它将类中的所有字段和引用的类放在同一行,因此放在一条记录中。我希望它将类映射到多行,这代表了我类中的部分。所以,看起来手动解析是要走的路。

标签: c# csv csvhelper


【解决方案1】:

好的,所以我想我已经弄明白了...我扭转了局面...我创建了一个 CsvFile 实例并使用 CsvHelper 将该实例写入 CSV 文件。结果是合理的,但不是我所期望的。

创建文件的内容:Mikie,54321,我是一个新评论。我因此,它将类中的所有字段和引用的类放在同一行,因此在一条记录中。我希望它将类映射到多行,这代表了我类中的部分。所以,看起来手动解析是要走的路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多