weixin_42221975 2024-03-28 21:16 采纳率: 0%
浏览 44

C#Datatable分类汇总

img


如图,图中数据已存入Datatable,改表的cloum很多有64列,现在想根据cloumName6对其他多列进行分类合计并存入新的DataTable中。新表也要是64列。PS:根据cloumName6对其他多列进行分类合计时,只对含数字的列进行合计。

  • 写回答

4条回答 默认 最新

  • 专家-皆知 2024-03-28 21:16
    关注

    引自免费微信小程序:皆我百晓生

    要解决这个问题,我们可以通过以下步骤操作:

    1. 首先,我们需要将整个C# DataTable 中的数据读取到本地(假设是通过DataTableReader类完成)。在C#中,我们可以使用以下代码来实现这个任务:
    using System.Data;
    using System.IO;
    
    public void ReadDataFromDataTable(string filePath)
    {
        // 创建一个DataTable对象
        DataTable dataTable = new DataTable();
    
        // 使用StreamReader类读取Excel文件中的数据
        using (StreamReader reader = File.OpenText(filePath))
        {
            // 分割行和列名
            string[] rows = reader.ReadToEnd().Split('\n');
            string[] columns = rows[1].Split(',');
    
            // 将每一列拆分为数组
            foreach (string column in columns)
            {
                string[] rowValues = row.Split(',');
                dataTable.Columns.Add(column.Trim());
                dataTable.Rows.Add(rowValues);
            }
        }
    
        // 将DataTable保存为CSV文件
        // 在这里假设我们已经有了一个名为"data.csv"的文件,并且包含以下列标题:
        // - cloumName: 具体的column名称
        // - columnValue: 值
        // ...
        using (StreamWriter writer = File.CreateText("data.csv"))
        {
            // 将Table转化为CSV格式
            writer.WriteLine("{0},{1}", "cloumName", "columnValue");
            foreach (DataRow row in dataTable.Rows)
            {
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    writer.Write(row[i].ToString() + ",");
                }
                writer.WriteLine();
            }
        }
    }
    

    这段代码首先创建了一个DataTable对象,然后通过StreamReader读取Excel文件中的数据。由于Excel文件可能具有嵌套的表格结构,我们使用了 Split('\n')方法来分割行和列名,这确保我们能够正确地解析每一行。

    接下来,我们将每一列拆分为数组,其中每一项代表一个行值,数组的第一元素是列名,第二元素是对应的数值。这些值被添加到新DataTable的相应列中,作为包含数字值的行数据。

    注意,这只是一个基础的示例,实际应用可能会涉及到更复杂的数据处理逻辑,例如填充缺失值、进行筛选和排序等。具体的操作方式取决于你的业务需求和个人偏好。

    为了对所有列进行分类汇总,你需要实现以下功能:

    1. 根据每个cloumName确定列的名字。
    2. 对每一个不为空的cloumName及其对应数值,计算其在另一个汇总列中的总和。
    3. 将汇总后的列添加到原始DataTable中,并更新汇总列的列标题。

    以下是将上述步骤整合在一起的代码实现:

    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.IO;
    
    public class CloumNameCategoryAggregator
    {
        public static void Main(string[] args)
        {
            // 读取DataTable中的数据
            string filePath = "path/to/data.xlsx";
            ReadDataFromDataTable(filePath);
    
            // 定义汇总列
            string[] summarizedColumns = { "col1", "col2", "col3", "col4", "col5", "col6" };
            string汇总ColumnName = "summary_column";
    
            // 更新原始DataTable
            var updatedDataTable = new DataTable();
            foreach (var tableName in DataContract蛟龙体.AllNamespaces())
            {
                if (!updatedDataTable.Contains(tableName))
                {
                    updatedDataTable.Add(tableName, GenerateSummaryData(tableName));
                }
            }
    
            // 输出汇总数据
            Console.WriteLine($"Cloum Name\tSummarized Column Value");
            foreach (var table in updatedDataTable)
            {
                foreach (var category in table[nameof(table)])
                {
                    Console.WriteLine($"{category}\t{table[category]}");
                }
            }
        }
    
        private static string GenerateSummaryData(string tableName)
        {
            // 生成一个空的汇总列
            var summaryColumn = GenerateSummaryColumn(tableName);
            return $"{tableName}, Summarized Column Value: {summaryColumn}";
        }
    
        private static string GenerateSummaryColumn(string tableName)
        {
            List<string> summarizedColumnsList = new List<string>();
    
            // 获取原始表格中不为空的列
            var columns = ExtractNonEmptyColumnsFromDataTable(tableName);
            foreach (var column in columns)
            {
                // 如果当前列不包含'summarized_column'列,则将其添加到列表中
                if (!summaryColumnsList.Contains(column.Trim()))
                {
                    summarizedColumnsList.Add(column.Trim());
                }
            }
    
            // 拼接汇总列名和值
            return $"{tableName}. Summarized Column Values: {String.Join(", ", summarizedColumnsList)}";
        }
    
        private static IEnumerable<string[]> ExtractNonEmptyColumnsFromDataTable(string tableName)
        {
            var rows = DataTable.OpenCursor命名为(tableName) as DataTable;
            while (rows.MoveNext())
            {
                var currentRow = rows.Current;
                var columns = currentRow.Columns.Cast<DataColumn>()
                                           .Where(c => c.Name != "summarized_column")
                                           .ToArray();
                yield return columns;
            }
        }
    }
    

    这个程序首先读取Excel文件中的数据,然后定义了一个汇总列名称和一个包含汇总值的列。它首先从原始DataTable中获取不为空的列,并检查这些列是否已经包含与汇总列相关的列。如果有,它就将这些列添加到汇总列的列表中,并使用拼接字符串的方法生成汇总列的名称和值。

    最后,它遍历原始DataTable中的所有列,并对于每个不为空的列,都会查找是否存在与汇总列相关联的列,如果存在,就将其名称和值拼接到一个新的汇总列中,并输出汇总数据。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月28日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见