使用 CsvHelper 将子对象迭代到 CSV 文件中 - 未为类型定义属性“Int32”

如何解决使用 CsvHelper 将子对象迭代到 CSV 文件中 - 未为类型定义属性“Int32”

使用 CSV Helper

我试图输出一个集合的内容,每个集合都包含子集合。 我之前已经成功地在单个可枚举集合上使用了 CSV 助手,但是在包含子对象时我被卡住了。

如下:

写出CSV的方法

public void dumpdata(List<FzLogModelSessionChronological> logData)
    {
        var fileName = $@"csv-{DateTime.Now:yy-MM-dd hhmmss}.csv";

        try
        {
            using (var writer = new StreamWriter($@"{_csvLocation}\{fileName}",true))
            {
                using (var csv = new CsvWriter(writer,CultureInfo.InvariantCulture))
                {
                    csv.Context.RegisterClassMap<SessionMap>();
                    csv.WriteRecords(logData);
                   
                }
            }
        }
        catch (Exception ex)
        {
           
        }
        finally
        {
           
        }

映射类

public sealed class SessionMap : ClassMap<FzLogModelSessionChronological>
{
    public SessionMap()
    {
        Map(m => m.SessionId);
        References<SesssionDataMap>(m => m.SessionData);
    }
}

public sealed class SesssionDataMap : ClassMap<FzLogModel>
{
    public SesssionDataMap()
    {
        Map(m => m.SessionId);
        Map(m => m.CommandString);
        Map(m => m.Command);
        Map(m => m.sourceIp);
        Map(m => m.User);
        Map(m => m.ActionDateTime);
    }
}

CSV 已创建,标题行也已创建,但在第一个时会产生错误

未为类型“System.Collections.Generic.List`1[FileZillaFtpLogParser.Models.FzLogModel]”定义属性“Int32 SessionId”

我哪里出错了?

解决方法

Csv 不太适合创建列表列表。如果 SessionDataFzLogModel 而不是 List<FzLogModel>,那么您的代码就可以正常工作。我找到了一个可能适合您的 solution,我已将其转换为与最新版本的 CsvHelper 配合使用。

void Main()
{
    var logData = new List<FzLogModelSessionChronological>(){
        new FzLogModelSessionChronological{
            SessionId = 1,SessionData = new List<FzLogModel>(){
                new FzLogModel {
                    SessionId = 1,CommandString = "CommandString1",Command = "Command1"
                },new FzLogModel {
                    SessionId = 2,CommandString = "CommandString2",Command = "Command2"
                }
            }
        }
    };

    try
    {
        var config = new CsvConfiguration(CultureInfo.InvariantCulture){ HasHeaderRecord = false};
        using (var csv = new CsvWriter(Console.Out,config))
        {
            csv.Context.TypeConverterCache.AddConverter<List<FzLogModel>>(new FzLogModelConverter());
            csv.WriteRecords(logData);
           
        }            
    }
    catch (Exception ex)
    {
       ex.Dump();
    }
    finally
    {
       
    }
}

public class FzLogModelSessionChronological
{
    public int SessionId { get; set; }
    [Index(2)]
    public List<FzLogModel> SessionData { get; set; }
}

public class FzLogModel
{
    public int SessionId { get; set; }
    public string CommandString { get; set; }
    public string Command { get; set; }
}

public class FzLogModelConverter : DefaultTypeConverter
{
    public override object ConvertFromString(string text,IReaderRow row,MemberMapData memberMapData)
    {
        var list = new List<FzLogModel>();
        if (text == null) return list;
        do
        {
            var barIndex = list.Count + 1;
            var bar = new FzLogModel
            {
                SessionId = row.GetField<int>($"SessionId_{barIndex}"),CommandString = row.GetField<string>($"CommandString_{barIndex}"),Command = row.GetField<string>($"Command_{barIndex}")
            };
            list.Add(bar);
        } while (row.CurrentIndex > 0 && row.CurrentIndex < row.Parser.Record.Length - 1);
        return list;
    }

    public override string ConvertToString(object value,IWriterRow row,MemberMapData memberMapData)
    {
        var bars = value as List<FzLogModel>;
        if (bars == null) return null;
        foreach (var bar in bars)
        {
            row.WriteField(bar.SessionId);
            row.WriteField(bar.CommandString);
            row.WriteField(bar.Command);
        }
        return null;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?