我试图将大量数据读入平面CSV。每行的一个字段是XML数据 - XML指示每行中的其他属性。因此,每一行的属性可能略有不同。
我在最初的结构化课程中得到了我的名单:
private class Response {
public Response() {
Values = new Dictionary<string, string>();
}
public string Owner { get; set; }
public string Author { get; set; }
public string Email { get; set; }
public string Data { get; set; } // XML data in here
public Dictionary<string, string> Values { get; set; }
public DateTime Created { get; set; }
}
然后我想让我的列表动态处理各种属性:
var responses = new List<dynamic>();
foreach (var response in query) {
if (!string.IsNullOrEmpty(response.Data))
{
var doc = new XmlDocument();
doc.LoadXml(response.Data);
foreach (XmlNode node in doc.GetElementsByTagName("field")) {
try
{
response.Values.Add(node.FirstChild.InnerText, node.LastChild.InnerText);
}
catch (Exception ex) {
// log
}
}
}
dynamic fullResponse = new ExpandoObject();
fullResponse.Owner = response.Owner;
fullResponse.Author = response.Author;
fullResponse.Email = response.Email;
fullResponse.Created = response.Created;
IDictionary<string, object> map = fullResponse;
foreach (var value in response.Values) {
if (map.ContainsKey(value.Key)) {
map[value.Key] = value.Value;
}
else {
map.Add(value.Key, value.Value);
}
}
responses.Add(fullResponse);
}
......也行得正常。但是现在我想基本上扁平化这个列表并将其导出为CSV,知道我的动态列表的每一行可能都有不同的属性。
抓住动态类型的PropertyInfo
,显然没有任何回复。我是否只需要遍历我的列表以手动提取独特的属性到像DataTable这样的东西?或者我可以使用Reflection进行一些调用以更有效地完成此操作?
答案 0 :(得分:0)
我最终使用普通的旧DataTable对其进行排序:
using (var dt = new DataTable())
{
var keys = responses.SelectMany(x => ((IDictionary<string, object>)x).Keys).Distinct();
var columns = keys.Select(x => new DataColumn(x)).ToArray();
dt.Columns.AddRange(columns);
foreach(IDictionary<string, object> response in responses)
{
var row = dt.NewRow();
foreach (var kvp in response)
{
row[kvp.Key] = kvp.Value;
}
dt.Rows.Add(row);
}
// write to CSV
}
虽然我觉得我可以用反射来做一些更酷的事情,以达到相同的效果。