【问题标题】:C# XML LINQ GroupBy from CSV File来自 CSV 文件的 C# XML LINQ GroupBy
【发布时间】:2019-11-20 09:39:46
【问题描述】:

我正在从 CSV 文件生成 XML。

在图片中我附上了我正在等待的结果

using (var reader = new StreamReader(csvPath + csvName))
{
    using (var csv = new CsvReader(reader))
    {

        csv.Configuration.HasHeaderRecord = true;
        csv.Configuration.RegisterClassMap<MapClass>();
        var records = csv.GetRecords<Data>().ToList();

         from w in records
         select

         // group by invoice number ?

        new XElement("INVOICE",
            new XAttribute("DATE",w._invoiceDate ),
            new XAttribute("NUMBER", w._invoiceNumber),
            new XAttribute("QTY", w._orderQty)  

        }
}

我想显示按发票编号分组的数据以及加起来的金额(相当于数据透视表)。我可以请你给我小费吗?

using (var reader = new StreamReader(csvPath + csvName))
            {
                using (var csv = new CsvReader(reader))
                {

                    csv.Configuration.HasHeaderRecord = true;
                    csv.Configuration.RegisterClassMap<MapClass>();
                    List<Data> records = csv.GetRecords<Data>().ToList();


                    var result = records.
                        GroupBy(x => x._invoiceNumber).
                        Select(x => new
                        {
                            // IGrouping does't contain 'Value" definition
                            InvoiceNumber = x.Key,
                            InvoiceQty = x.Value.Sum(y => y._orderQty),
                            InvoiceTotal = x.Value.Sum(y => y._invoiceTotal)
                        }).ToList();
                }

            }

【问题讨论】:

标签: c#


【解决方案1】:

下面的代码应该给你期望的表数据,进一步你可以生成你需要的 XML

var result = records.GroupBy(x => x._invoiceNumber).Select(x => new { InvoiceNumber = x.Key, InvoiceQty = x.Sum(y => y._orderQty), InvoiceTotal = x.Sum(y => y._invoiceTotal) }).ToList()

【讨论】:

  • 我得到了不允许将 lambda 转换为删除的信息
  • 澄清一下,您是否收到任何错误或异常信息。
  • GroupBy 返回键值结构。所以价值是特定组的发票集合
  • 好的,但我有一个“值”的编译错误。你有什么主意吗 ?我在上面添加了这段代码
【解决方案2】:

我们可以关闭这个话题。我找到了解决办法

var res =   from e in records
                        group e by e._invoiceNumber into g
                        where g.Count() >= 1
                        select new
                        {
                            Invoice = g.Key,
                            Total = g.Count(),
                            TotalQty = g.Sum(x => Convert.ToInt32( x._orderQty.ToString()))
                        };


                        foreach(var item in res)
                        {
                            Console.WriteLine($" {item.Invoice}  :   {item.TotalQty}  ");
                        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多