c#datatable合併詳解

一、合併簡介

在c#開發中,做數據處理時經常用到datatable,而那些單元格相等的datatable需要合併。合併是將一些行或列按照某種規則合併成新的行列,這樣做可以使數據變得更加整潔,方便我們運用。以下是介紹datatable合併的幾種方法:

二、按行合併

按照相鄰單元格的值,把同一行的單元格合併。比如將以下表格的行列合併,結果會得到新的二維表:

DataTable dt = CreateTable();
if(dt ==null)
{
    Console.WriteLine("datatable為空");
    return;
}
for(int i =0; i
=0; j--) { if(dt.Rows[i][j].ToString() == dt.Rows[i+1][j].ToString()) { dt.Rows[i][j] = dt.Rows[i+1][j]; dt.Rows[i+1].Delete(); } } }

在這段代碼中,首先判斷datatable是否為空,之後就是按行遍歷整個datatable,把相鄰單元格的值相同的行合併起來。這做法比較簡單,但是只能實現單元格值相等的情況,且只支持按行合併,不能完成按列合併。

三、按列合併

對於按列合併,需要先使用pivot方法,將列轉化為行。以我們上一張表格為例,將其行列轉置後變成下圖:

之後按照相鄰單元格的值將列合併。以下是具體實現步驟:

DataTable dt = CreateTable();
if(dt == null) return;
//將列轉為行,並把新行插入dt中
DataTable newTable = new DataTable();
for(int i =0; i<dt.Columns.Count; i++)
{
    DataRow newRow = newTable.NewRow();
    newRow[0] = dt.Columns[i].ColumnName;
    for(int j =0; j<dt.Rows.Count; j++)
    {
        string columnName = dt.Columns[i].ColumnName;
        newRow[j+1] = dt.Rows[j][columnName];
    }
    newTable.Rows.Add(newRow);
}

//按列合併
for(int i =0; i=0; j--)
    {
        if(j-1>=0 && newTable.Rows[i][j-1].ToString() == newTable.Rows[i][j].ToString())
        {
            newTable.Rows[i][j-1] = newTable.Rows[i][j];
            newTable.Columns.Remove(newTable.Columns[j]); 
        }
    }
}

//將行轉回列
for(int i = 0; i<newTable.Columns.Count; i++)
{
    DataRow newRow = dt.NewRow();
    newRow[0] = newTable.Columns[i].ColumnName;
    for(int j =1; j<newTable.Rows.Count; j++)
    {
        newRow[j] = newTable.Rows[j][i];
    }
    dt.Rows.Add(newRow);
}

該代碼首先將列轉化成行,之後遍歷新的datatable,按照相鄰單元格的值將列進行合併。最後再將行轉化回原來的列格式,合併過程就完成了。

四、按照特定列合併

在實際應用中,我們通常需要按照某些列進行合併,而不是將整個表進行合併。以下是針對具有「省份」和「城市」兩列的表格進行合併的代碼:

DataTable dt = CreateTable();
if (dt == null) return;

DataView dataView = dt.DefaultView;
dataView.Sort = "省份 asc, 城市 asc";
DataTable newTable = dataView.ToTable();

for (int i = newTable.Rows.Count - 1; i > 0; i--)
{
    if (newTable.Rows[i]["省份"].ToString() == newTable.Rows[i - 1]["省份"].ToString() &&
        newTable.Rows[i]["城市"].ToString() == newTable.Rows[i - 1]["城市"].ToString())
    {
        for (int j = 2; j <= newTable.Columns.Count - 1; j++)
        {
            if (newTable.Rows[i][j].ToString() != "")
                newTable.Rows[i - 1][j] = newTable.Rows[i][j];
        }
        newTable.Rows.Remove(newTable.Rows[i]);
    }
}

該代碼中,首先對datatable按照「省份」和「城市」兩列進行排序,並新建一個datatable達到排序的效果。之後遍歷排序後的datatable,按照「省份」和「城市」兩列進行合併。具體操作就是將相鄰的重複行的其他列進行合併。

五、按照正則表達式合併

另外,還可以按照正則表達式進行合併。以下是基於正則表達式進行datatable合併的代碼:

DataTable dt = CreateTable();
if (dt == null) return;

var regex = new Regex(@"[0-9]+");
var dict= new Dictionary<string, List<DataRow>>();

foreach(DataRow dr in dt.Rows)
{
    foreach(DataColumn dc in dt.Columns)
    {
        var key = dc.ColumnName;
        var match = regex.Match(dr[dc].ToString());
        if(match.Success)
        {
            key+= match.Value;
        }
        if(dict.ContainsKey(key))
        {
            dict[key].Add(dr);
        }
        else
        {
            dict[key] = new List<DataRow>{dr};
        }
    }
}
var newTable = dt.Clone();
foreach(var group in dict)
{
    var newRow = newTable.NewRow();
    foreach(var col in newTable.Columns)
    {
        var colName = col.ToString();
        if(colName.Contains("(+)"))
        {
            colName = colName.Replace("(+)", "").Trim();
            var sum = 0;
            foreach(var row in group.Value)
            {
                sum+= int.Parse(row[colName].ToString());
            }
            newRow[colName] = sum;
        }
        else
        {
            newRow[colName] = group.Value.FirstOrDefault()[colName];
        }
    }
    newTable.Rows.Add(newRow);
}

這段代碼中,首先對每個單元格進行正則表達式匹配,匹配成功的列依據匹配的數字建立key,並把該行記錄加入到列表中。之後再根據key進行合併,遍歷相鄰相同的組的其他列進行合併。在這個例子中,我們要求的是列內的和,因此將「(+)」符號作為和的標誌,將相鄰相同組內的和加起來形成新的值。最後,代碼將合併後的datatable返回。

六、總結

上述就是針對datatable合併的幾種不同的方法,分別涉及到按行合併、按列合併、按照特定列合併、正則表達式等。實際應用中可能還會出現其他數據合併問題,需要按照具體情況進行不同的合併方法。綜上所述,datatable合併對於數據處理是必不可少的功能。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/242734.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:51
下一篇 2024-12-12 12:51

相關推薦

  • jQuery Datatable分頁中文

    jQuery Datatable是一個非常流行的數據表插件,它可以幫助您快速地在頁面上創建搜索、過濾、排序和分頁的數據表格。不過,它的默認設置是英文的,今天我們就來探討如何將jQu…

    編程 2025-04-29
  • C# DataTable克隆行用法介紹

    本文將從多個方面詳細闡述C# DataTable中克隆行的用法及其注意事項。 一、克隆行的概述 在C# DataTable中,克隆行是指將DataTable中指定的行克隆一份,生成…

    編程 2025-04-29
  • 如何使用Newtonsoft datatable轉Json

    Newtonsoft DataTable 是一個基於.NET的JSON框架,也是一個用於序列化和反序列化JSON的強大工具。 在本文中,我們將學習如何使用Newtonsoft Da…

    編程 2025-04-28
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25

發表回復

登錄後才能評論