> 백엔드 개발 > C++ > 구조가 서로 다른 여러 DataTable을 단일 테이블로 효율적으로 병합하려면 어떻게 해야 합니까?

구조가 서로 다른 여러 DataTable을 단일 테이블로 효율적으로 병합하려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2025-01-01 12:20:10
원래의
269명이 탐색했습니다.

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

여러 DataTable을 하나의 포괄적인 테이블로 결합

과제:
정렬을 보장하면서 열 정의와 행 개수가 다른 여러 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을 단일 테이블로 효율적으로 병합하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿