将Datatable转换/处理为Custom PSObject的最快方法

时间:2015-09-23 16:27:29

标签: mysql powershell datatable

我可以从MySql查询(例如)填充数据表$ devices:

PS C:\Users\MKANET\Desktop\dev\lab> $devices.table[10]

name                                    ip                                          mac                                    vendor
----                                    --                                          ---                                    ------
ComputerTest                            10.51.18.6                                  fd1969ff4cb9                           HewlettP

我想将该数据表类型转换为自定义PSObject;其中,mac列转换为PSObject NoteProperty名称“Mac-Address”;并且,各个值转换为00-00-00-00字符串格式:

PS C:\Users\MKANET\Desktop\dev\lab> $devices[1]

name                               ip                                      MAC-Address                             vendor
-------                            --                                      -----------                             ------------
ComputerTest                       10.51.18.6                              fd-19-69-ff-4c-b9                       HewlettP

考虑到这些数据表可能相对较大(可能有几百行),我需要最快的处理方法在Powershell中执行此操作。

如果它能使转换/修改过程明显加快,我会很高兴将$ Devices作为数据表;仅修改/处理“mac”列的值为:00-00-00-00-00-00文本格式,永久

3 个答案:

答案 0 :(得分:1)

为了清楚一些读者:在PowerShell中,DataTable PS对象,只有一个具有[System.Data.DataTable]类型。此类型(类)提供了许多操作对象的方法,例如添加新列(在@ e-z-hart提供的答案中显示)。

将对象转换为通用' PSObject'有效地意味着剥离与[DataTable]类相关的所有其他方法等,只留下一个简单的对象。你可以这样做:

$obj = $devices.table[10] | foreach {

  $macaddress = ($_.mac -replace '(..)','$1-').TrimEnd("-")

  New-Object -TypeName PSObject -Property @{
    "name         = [System.String]        $_.name
    "ip"          = [System.Net.IPAddress] $_.ip
    "mac-address" = [System.String]        $macaddress
    "vendor"      = [System.String]        $_.vendor
  }
}

希望带有正则表达式的-replace运算符更优雅(参见@ e-z-hart的回答),而不是用子串函数切断mac地址。有人可以改进正则表达式,这样就不必修剪尾随的" - "最后。

对于"几百个"这应该是相当快的。你提到的行。

请注意,对于奖励积分,' ip' column被转换为[System.Net.IPAddress]类型,其中包含一个ToString()方法,用于返回我们通常看到它们的点缀格式的地址。我认为这是过度的,所以你可能想要这个是一个[System.String]。

最后,如果您确实希望MAC-Address列成为NoteProperty,那么我将New-Object cmdlet中的属性列表中的该列排除并使用Add-Member。您可以将New-Object的输出分配给变量,然后将其传递给Add-Member,或者只是尝试一次性执行,New-Object的输出流水线为{{ 1}}:

Add-Member

答案 1 :(得分:1)

使用Select-Object,它应该在Powershell中将DataRow / DataTable自动转换为PSCustomObject。以下是我将运行转换为PSCustomObject并在一行中处理MAC地址格式的操作。这可以应用于特定索引处的单个行(如示例代码)或整个DataTable以转换为PSObject数组。

MAC地址格式化会删除原始中的任何非字母数字字符,强制转换为小写,然后将连字符插入相应的索引。

$devices.table[10] | Select-Object name,ip,@{N="MAC-Address";E={((((($_.mac -replace '[^a-zA-Z0-9]','').ToLower().insert(2,"-")).insert(5,"-")).insert(8,"-")).insert(11,"-")).insert(14,"-")}},vendor

答案 2 :(得分:0)

您只需使用表达式列将MAC列的格式化版本添加到数据表对象即可。编写表达式可能有一种更优雅的方式,但这样可行(我假设$ devices是一个DataTable):

ct.addElement(p1);
ct.addElement(p2);
ct.addElement(p3);