powershell - 在 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,但这似乎更像是基于第一个表中的单个条件的第二个表的过滤器。如果没有更好的选择,我很乐意将上面的代码分享给大家。
解决方案
推荐阅读
- javascript - ReduxForm Field 组件不适用于列 Headers 中的 ReactTable Cell 属性
- javascript - 从嵌套对象中删除某些对象的最佳方法是什么?
- html - 如何设置
- 垂直?
- vb.net - 'GeckoButtonElement' 不包含带有 1 个参数的构造函数
- python - 熊猫:在多列上分组
- tensorflow - 使用 GradientTape 在 Tensorflow 中进行梯度计算 - 获得意外的无值
- laravel - Composer:SSL 证书问题:无法获取本地颁发者证书
- css - 用于在 React 中为自定义模态添加“弹出”效果的 CSS
- javascript - 如何将数据从 Flask 传递到 JavaScript
- javascript - Javascript DDT 不使用 csv 文件中的 $ 字符