我使用FileHelpers DelimitedClassBuilder根据数据表中的元数据构建一个类。这样我就可以读取元数据中已知的任何文件。我将其作为流阅读并单独处理每条记录。为了进一步处理,我想在数据中添加一些字段,然后将其序列化为JSON。添加不起作用的字段部分。流返回一个对象。我正在使用解决方法。将对象序列化为JSON,将其反序列化为字典,添加字段,然后再将其序列化为JSON。我确信这可以通过更有效的方式完成。我尝试将其转换为列表,但这不起作用。
//build runtime class based on metadata
FD.DelimitedClassBuilder cb = new FD.DelimitedClassBuilder("ImportFile", "|");
cb.IgnoreFirstLines = 1;
foreach (DT.DataRow drMetadata in dtMetadata.Rows)
{
cb.AddField(drMetadata["EntityColumnName"].ToString(), typeof(string));
cb.LastField.FieldQuoted = true;
cb.LastField.QuoteMode = FH.QuoteMode.AlwaysQuoted;
cb.LastField.QuoteMultiline = FH.MultilineMode.AllowForBoth;
}
//create async filehelper engine for row by row processing
FH.FileHelperAsyncEngine fhe = new FH.FileHelperAsyncEngine(cb.CreateRecordClass());
using (fhe.BeginReadStream(file))
{
foreach(object record in fhe)
{
//convert object to list, doesn't work
//SG.List<object> blaat = (record as SG.IEnumerable<object>).Cast<object>().ToList();
//serialize record class to json
string json = JS.JsonConvert.SerializeObject(record, JS.Formatting.Indented);
//convert message to key-value dictionary
SG.IDictionary<string, string> values = JS.JsonConvert.DeserializeObject<SG.IDictionary<string, string>>(json);
values.Add("SourceSystem", messagesource);
values.Add("SourceType", messagetype);
string json2 = JS.JsonConvert.SerializeObject(values, JS.Formatting.Indented);
SY.Console.WriteLine(json2);
}
}
fhe.Close();
答案 0 :(得分:0)
您可以使用通过记录类中的反射获得的字段列表。然后使用Linq的ToDictionary
填充您的values
。
var recordClass = cb.CreateRecordClass();
List<FieldInfo> fields = recordClass.GetFields().ToList();
FileHelperAsyncEngine fhe = new FileHelperAsyncEngine(recordClass);
using (fhe.BeginReadStream(file))
{
foreach (var record in fhe)
{
IDictionary<string, object> values = fields.ToDictionary(x => x.Name, x => x.GetValue(record));
values.Add("SourceSystem", "messagesource");
values.Add("SourceType", "messagetype");
string json = JsonConvert.SerializeObject(values, Formatting.Indented);
Console.WriteLine(json);
}
}