将列表转换为数据透视列表

2023-12-07

我有一个清单:

IList<PIData> list = new List<PIData>()

这会返回一个如下列表:

Timestamp        | End              | HeaderTitle | Value
=========================================================
12/12/2012 00:00 | 12/12/2012 00:01 | Test1       | 0.23
12/12/2012 00:00 | 12/12/2012 00:01 | Test2       | 0.34
12/12/2012 00:00 | 12/12/2012 00:01 | Test3       | 0.556

这种情况持续不断,有时我会有 50-100 个不同的标题标题

我需要能够对其进行旋转并最终将其写入 CSV,其中 Row 是标题。我知道如何将对象转换为 CSV,但我很难旋转列表并希望有人可以提供帮助。

这是我想要的样子:

Timestamp        | End              | Test1 | Test2 | Test3 | etc
==================================================================
12/12/2012 00:00 | 12/12/2012 00:01 | 0.23  | 0.34  | 0.556
12/12/2012 00:01 | 12/12/2012 00:02 | 0.23  | 0.34  | 0.556
12/12/2012 00:02 | 12/12/2012 00:03 | 0.23  | 0.34  | 0.556

有人可以帮我完成这项工作吗?我真的只需要能够将我的列表转换为一个新列表,该列表最终将是一个 CSV 文件...我知道如何在 SQL 中执行此操作,但在这种情况下我无法使用 SQL。


这是我最终所做的对我有用的事情:

namespace ConsoleApplication3
{
class Program
{

    internal class PiData
    {
        public string HeaderName { get; set; }
        public DateTime TimeStamp { get; set; }
        public DateTime End { get; set; }
        public double Value { get; set; }
    }

    static void Main(string[] args)
    {
        var PD = new List<PiData>()
        {
            new PiData() { HeaderName="Test1", End = DateTime.Now.AddSeconds(15), TimeStamp = DateTime.Now, Value = 0.01 },
            new PiData() { HeaderName="Testf2", End = DateTime.Now.AddSeconds(15), TimeStamp = DateTime.Now, Value = 0.51 },
            new PiData() { HeaderName="Testff3", End = DateTime.Now.AddSeconds(15), TimeStamp = DateTime.Now, Value = 0.71 },
            new PiData() { HeaderName="Testfsd4", End = DateTime.Now.AddSeconds(15), TimeStamp = DateTime.Now, Value = 0.41 },
            new PiData() { HeaderName="Test1", End = DateTime.Now.AddSeconds(30), TimeStamp = DateTime.Now.AddSeconds(15), Value = 0.01 },
            new PiData() { HeaderName="Testf2", End = DateTime.Now.AddSeconds(30), TimeStamp = DateTime.Now.AddSeconds(15), Value = 0.51 },
            new PiData() { HeaderName="Testff3", End = DateTime.Now.AddSeconds(30), TimeStamp = DateTime.Now.AddSeconds(15), Value = 0.71 },
            new PiData() { HeaderName="Testfsd4", End = DateTime.Now.AddSeconds(30), TimeStamp = DateTime.Now.AddSeconds(15), Value = 0.41 },
        };


    var result2 = PD.Pivot(emp => emp.TimeStamp, emp2 => emp2.HeaderName, lst => lst.Sum(a => a.Value));
    StringBuilder sb = new StringBuilder();

    List<string> columns = new List<string>();
    columns.Add("TimeStamp");
    columns.Add("End");
    foreach (var item in PD.Select(a => a.HeaderName).Distinct())
    {
        columns.Add(item);
    }
    foreach (var item in columns)
    {
        sb.Append(item + ",");
    }
    sb.Remove(sb.Length - 1, 1);
    sb.AppendLine();
    foreach (var row in result2)
    {
        sb.Append(row.Key + "," + row.Key.AddSeconds(10).ToString() + ",");
        foreach (var column in row.Value)
        {
            sb.Append(column.Value + ",");
        }
        sb.Remove(sb.Length - 1, 1);
        sb.AppendLine();
    }
    Console.WriteLine(sb.ToString());
    Console.WriteLine("----"); 

    }
}

public static class LinqExtenions
{

    public static Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>> Pivot<TSource, TFirstKey, TSecondKey, TValue>(this IEnumerable<TSource> source, Func<TSource, TFirstKey> firstKeySelector, Func<TSource, TSecondKey> secondKeySelector, Func<IEnumerable<TSource>, TValue> aggregate)
    {
        var retVal = new Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>>();

        var l = source.ToLookup(firstKeySelector);
        foreach (var item in l)
        {
            var dict = new Dictionary<TSecondKey, TValue>();
            retVal.Add(item.Key, dict);
            var subdict = item.ToLookup(secondKeySelector);
            foreach (var subitem in subdict)
            {
                dict.Add(subitem.Key, aggregate(subitem));
            }
        }

        return retVal;
    }
}


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将列表转换为数据透视列表 的相关文章

随机推荐