0
votes

Comment convertir un ensemble de données en une matrice

Après avoir tiré des données de SQL dans PowerShell, j'ai un jeu de données. Comment puis-je convertir cela en un tableau?

$ data.Tables | GM code> me donne typename: system.data.dataset code> p>

Si je demande des informations dans la table I tirée, je reçois: p>

$data.Tables | fl

ServerName              : Server10
SamAccount              : Admin-Server10


1 commentaires

On dirait que la seule ligne est la raison pour laquelle ce n'est pas un tableau pour commencer. Parce que ce n'est pas le cas. Si vous obtenez votre jeu de données dans un «objet» PowerShell (variable) et do $ data [0] Qu'est-ce qu'il retourne?


3 Réponses :


1
votes

Essentiellement, vous devez vous dérouler tout pour aller d'un réseau multidimensionnel à une matrice de dimension unique. Le chemin d'accès d'un jeu de données à une seule ligne est la suivante: xxx

qui est: xxx

ou, pour une doublure simplifiée : xxx

ceci vous permet ensuite d'accéder aux propriétés que vous attendez. xxx


3 commentaires

Cela lui permet de faire référence facilement aux choses, mais ses données sont réglées à la lecture, de sorte qu'il ne peut manipuler aucune valeur, ce qui était le point de son poste.


Cela explique comment accéder aux données a réessayées, mais cela ne me laissait toujours pas le manipuler. Si je me suis fatigué $ DataSet.tables [0] .Rows [0] .Servername = "Test" Il échoue toujours.


Non, n'utilisez pas $ DataSet.Tables [0] .ors [0] .Servername car, oui, le jeu de données est en lecture seule. Attribuez la ligne à la variable de ligne et utilisez le datarow tel qu'il n'est pas lu uniquement.



0
votes

Vous pouvez créer un objet pour chaque ligne, puis renseigner leurs valeurs en fonction des colonnes de la table. Cela vous donnerait une pscustomObject pour chaque ligne avec des propriétés que vous pouvez faire référence et modification.

    $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
}


3 commentaires

Peut-être que je manque quelque chose de simple. Utilisation de votre code exactement comme écrit, lorsque je tape $ myarray, je vois les sous-types. Mais si j'essaie de faire un myarray.servername = "dd" il échoue à dire que la propriété est introuvable sur l'objet.


C'est parce que $ myarray est un tableau d'objets. Vous pouvez supprimer le [tableau] de la première ligne ou référencer l'objet dans la matrice par index $ myarray [0] .Servername = "dd"


Testé cela, sans référence [tableau], c'est exactement ce que j'essayais d'y aller. Merci .. vous avez 26k (en ce moment), les points peuvent donc ne pas dire grand chose, mais ils sont à vous. Même les valeurs dans le nouvel objet conservent des types. (string vs booléen). Parfait, merci..



0
votes

La réponse donnée par ThemadTechnicien est correcte. Voici une autre manière plus rapide (si nous parlons de milliers de lignes) qui ne bouclent que les noms de colonne une fois et stockent les objets dans une arrayliste

Premièrement, obtenez tous les noms de propriété P>

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


0 commentaires