[英]How do I create a spring .Net standalone object of type Int32 defined in the IOC context file?
[英]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 不太適合創建列表列表。 如果SessionData
是FzLogModel
而不是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.