首页 > 解决方案 > 在 Powershell 中加入两个数据表?

问题描述

我正在寻找在 Powershell 中加入两个大型数据表的解决方案。每个决赛桌桌将有大约。1 mio 行。我花了一些时间通过 LINQ 和嵌入式 C# 代码创建一个解决方法,但我不确定这是否是最有效的方法。

这是一个演示代码,显示了我的自定义数据表加入操作:

cls
Remove-Variable * -ea 0
$ErrorActionPreference = 'stop'

add-type -TypeDefinition @"
    using System;
    using System.Data;
    using System.Data.DataSetExtensions;
    using System.Linq;
    namespace Linq {
        public class DataTables {
            public static DataTable Join(DataTable dt1, string column1, DataTable dt2, string column2){
                DataTable dt3 = new DataTable();
                Type ty = dt1.Columns[column1].GetType();
                DataTable[] dta = {dt1, dt2};
                for (int i=0; i<dta.Length; i++) {
                    string tableName = dta[i].TableName;
                    if (string.IsNullOrEmpty(tableName)) {tableName = "table" + i.ToString();};
                    foreach (DataColumn column in dta[i].Columns) {
                        string columnName = tableName + '/' + column.ColumnName;
                        dt3.Columns.Add(columnName, column.DataType);
                    }
                }
                return (
                    dt1.AsEnumerable().Join(
                        dt2.AsEnumerable(), 
                        a => a[column1], 
                        b => b[column2],
                        (a, b) => {
                            DataRow row = dt3.NewRow();
                            row.ItemArray = a.ItemArray.Concat(b.ItemArray).ToArray();
                            return row;
                        }
                    )
                ).CopyToDataTable();
            }
        }
    }
"@ -ReferencedAssemblies 'System.Xml','System.Data','System.Data.DataSetExtensions'

#define customer table:
$table_customer = [System.Data.DataTable]::new('customer')
[void]$table_customer.Columns.Add('id', 'int')
[void]$table_customer.Columns.Add('name', 'string')

# define order table:
$table_order = [System.Data.DataTable]::new('order')
[void]$table_order.Columns.Add('id', 'int')
[void]$table_order.Columns.Add('customer_id', 'int')
[void]$table_order.Columns.Add('name', 'string')

# fill both tables:
$oId = 0
foreach($cId in (1..3)) {
    [void]$table_customer.rows.Add($cId, "customer_$cId")
    foreach($o in 1..3) {
        $oId++
        [void]$table_order.rows.Add($oId, $cId, "customer_$cId order_$o")
    } 
}

# join the tables:
$table_joined = [Linq.DataTables]::Join($table_customer, 'id', $table_order, 'customer_id')

$table_customer | ft -AutoSize
$table_order    | ft -AutoSize
$table_joined   | ft -AutoSize

有没有我错过的内置功能?我在玩 System.Data.DataRelation,但这似乎更像是基于第一个表中的单个条件的第二个表的过滤器。如果没有更好的选择,我很乐意将上面的代码分享给大家。

标签: powershelllinqjoindatatable

解决方案


推荐阅读