ホームページ >バックエンド開発 >C++ >異なる構造を持つ複数の DataTable を 1 つのテーブルに効率的にマージするにはどうすればよいですか?

異なる構造を持つ複数の DataTable を 1 つのテーブルに効率的にマージするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-01 12:20:10276ブラウズ

How Can I Efficiently Merge Multiple DataTables with Different Structures into a Single Table?

複数の DataTable を 1 つの包括的なテーブルに結合する

課題:
列定義と行数が異なる複数の DataTable を、位置合わせを確保しながら結合するデータの整合性を維持するには、

解決策:
この問題を克服し、単一の包括的な DataTable を作成するには、次のカスタム メソッドを使用できます:

public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn)
{
    // Validate arguments
    if (!tables.Any())
        throw new ArgumentException("Tables must not be empty", "tables");
    if (primaryKeyColumn != null)
        foreach (DataTable t in tables)
            if (!t.Columns.Contains(primaryKeyColumn))
                throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn");

    DataTable table = new DataTable("TblUnion");

    // Disable data validation during bulk loading
    table.BeginLoadData();

    // Merge all tables into the result table
    foreach (DataTable t in tables)
        table.Merge(t, false, MissingSchemaAction.Add);

    // End data validation
    table.EndLoadData();

    // Handle duplicate primary keys (if specified)
    if (primaryKeyColumn != null)
    {
        // Group rows by primary key column
        var pkGroups = table.AsEnumerable().GroupBy(r => r[primaryKeyColumn]);

        // Identify groups with duplicate keys
        var dupGroups = pkGroups.Where(g => g.Count() > 1);

        // Combine data from duplicate rows into the first row of each group
        foreach (var grpDup in dupGroups)
        {
            // Use the first row and modify it to include data from other rows
            DataRow firstRow = grpDup.First();
            foreach (DataColumn c in table.Columns)
            {
                if (firstRow.IsNull(c))
                {
                    // Find the first non-null row for the current column and copy its value
                    DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c));
                    if (firstNotNullRow != null)
                        firstRow[c] = firstNotNullRow[c];
                }
            }

            // Remove duplicate rows
            var rowsToRemove = grpDup.Skip(1);
            foreach (DataRow rowToRemove in rowsToRemove)
                table.Rows.Remove(rowToRemove);
        }
    }

    // Return the merged table
    return table;
}

使用法:

var tables = new[] { tblA, tblB, tblC };
DataTable TblUnion = tables.MergeAll("c1");

このメソッドは、マージのための堅牢なソリューションを提供します。 DataTables、データの配置の処理、および主要なデータの保存。

以上が異なる構造を持つ複数の DataTable を 1 つのテーブルに効率的にマージするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。