如何将数据集转换为数组

时间:2019-04-10 21:23:56

标签: powershell

在Powershell中从SQL中提取数据之后,我有了一个数据集。 如何将其转换为数组?

$data.tables | gm给了我TypeName: System.Data.DataSet

如果我从拉出的桌子中索取信息,我会得到:

$data.Tables | fl

ServerName              : Server10
SamAccount              : Admin-Server10

但是$ data是只读的。我不打算写回数据库,但希望能够在内存中使用并更改数据。

我想要的是一个包含这些值的字符串数组。

好的,我可以这样做:

$x = "" | select servername,SamAccount $x.Servername = $data.tables.servername

,但是必须有一种更简单的方法。我提取的数据集有100列以上。

是否有一种方法可以将其转换为仅字符串数组(或任何称为它的字符串)。可以在其中访问数据元素的字符串?

我想要能够使用的是

write-host "$($x.servername)"

并获取Server10

顺便说一句,数据集中只有1行数据。只是很多列。

3 个答案:

答案 0 :(得分:1)

从本质上讲,您必须展开所有内容才能从多维数组转换为单维数组。从数据集到单行的路径是:

DataSet -> DataTableCollection -> DataTable -> DataRowCollection -> DataRow

哪个是

$DataTableCollection = $DataSet.Tables   #Get the Tables
$DataTable = $DataTableCollection[0]     #Only need the first Table
$DataRowCollection = $DataTable.Rows     #Get the Rows
$DataRow = $DataRowCollection[0]         #Only need the first Row

或者,对于简化的单线:

$Row = $DataSet.Tables[0].Rows[0]

然后,您可以按期望的方式访问属性。

$Row.ServerName = "asdf"

答案 1 :(得分:0)

您可以为每一行创建一个对象,然后根据表的列填充其值。这样,您将为每行提供一个PSCustomObject,并具有可以引用和修改的属性。

    $MyArray = ForEach($Row in $Data.Tables[0].Rows){
    $Record = New-Object PSObject
    ForEach($Col in $Data.Tables[0].Columns.ColumnName){
        Add-Member -InputObject $Record -NotePropertyName $Col -NotePropertyValue $Row.$Col
    }
    $Record
}

完成此操作后,$MyArray将是一组自定义对象,您可以根据需要使用它们。

答案 2 :(得分:0)

TheMadTechnician 给出的答案是正确的。这是另一种更快的方法(如果我们谈论的是数千行),它只循环列名一次并将对象存储在数组列表中

首先获取所有的属性名称

[string[]]$Properties = @()
Foreach($col in $DataSet.Tables[0].Columns) {
    $Properties += $col;
}

然后,将所有行作为 PSCustomObject(包含数据集中的列名)添加到数组列表:

$arrayList = New-Object System.Collections.ArrayList
Foreach($row in $DataSet.Tables[0]) {
    $arrayList.Add(($row | Select-Object $Properties)) > $null;
}