簡體   English   中英

使用 CsvHelper 將子對象迭代到 CSV 文件 - 沒有為類型定義屬性“Int32”

[英]Using CsvHelper to iterate child objects into CSV file - Property 'Int32' is not defined for type

使用CSV 助手

我正在嘗試 output 集合的內容,每個集合都包含子 collections。 我之前在單個可枚舉 collections 上成功使用了 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 已創建,header 行也已創建,但它在第一個生成錯誤

沒有為類型“System.Collections.Generic.List`1[FileZillaFtpLogParser.Models.FzLogModel]”定義屬性“Int32 SessionId”

我哪里錯了?

Csv 不太適合創建列表列表。 如果SessionDataFzLogModel而不是List<FzLogModel>那么您的代碼就可以正常工作。 我找到了一個可能對您有用的解決方案,我將其轉換為與最新版本的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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM