在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行数据。只是很多列。
答案 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;
}