如何解决使用 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);
}
}
未为类型“System.Collections.Generic.List`1[FileZillaFtpLogParser.Models.FzLogModel]”定义属性“Int32 SessionId”
我哪里出错了?
解决方法
Csv 不太适合创建列表列表。如果 SessionData
是 FzLogModel
而不是 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 举报,一经查实,本站将立刻删除。