Question
Hastable contenant u arraylist
- lakcil
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 23
- Remerciements reçus 0
Mon problème est le suivant:
J'ai un fichier dans lequel j'ai des cluster et des vm (vm ware)comme ceci:
VM1;cluster1
VM2;cluster2
VM3;cluster1
VM4;cluster4
VM5;cluster4
J'ai donc par ligne une vm associée à un cluster.
Mon souhait est de d'organiser tout ça de manière à avoir un cluster et la liste de ses vm.
Le moyen le plus efficace que j'ai trouvé est de faire un hastable ayant pour clé mon cluster et valeur un arraylist de mes vm.
Je mets en pièce jointe le code qui me pose probleme.
En effet lorsque j'ajoute un nouvel élément à la liste des VM j'ai une erreur sur la liste des vm. La variable est de type string au lieu de type arraylist.
erreur à la ligne 19 au niveau de \"$nouvelleListeEtape.Item($splitPipe[1]).Add($splitPipe[0])| Out-Null\"
Merci pour vos réponses
La pièce jointe lecture_cluster.ps1 est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
tu ajoutes une string en tant que valeur de clé et pas un arraylist:
[code:1]
$nouvelleListeEtape.Item($splitPipe[1]).Add($splitPipe[0])| Out-Null
[/code:1]
Ceci dit, sur le code je n'y trouve presque rien à y redire, propre et structuré.
Mais je m'interroge sur l'objectif de ces instructions :
[code:1]
$splitPipe=$ligne.Split(\";\"«»)
if($splitPipe[0] -ne 0 -and $splitPipe[1] -ne 0)
[/code:1]
Quel est l'objectif de comparer du texte avec un entier.
Ensuite de coder à la C# sous PowerShell à ces limites, rien que le debug de ce code m'est laborieux
[code:1]
function LectureFichierCluster{
param([String]$Fichier)
#Initialise la liste des étapes
$nouvelleListeEtape = New-Object System.Collections.Hashtable
$ligne = (Get-Content $Fichier)[0]
$splitPipe=$ligne.Split(\";\"«»)
if($splitPipe[0] -ne 0 -and $splitPipe[1] -ne 0)
{
$listeElem = New-Object System.Collections.ArrayList
$nouvelleListeEtape.Add($splitPipe[1],$listeElem)
}
foreach ($ligne in Get-Content $Fichier)
{
$splitPipe=$ligne.Split(\";\"«»)
Write-debug \"$splitPipe\"
if($splitPipe[0] -ne 0 -and $splitPipe[1] -ne 0)
{
Write-debug \"if contains $($splitPipe[1])\"
if($nouvelleListeEtape.Contains($splitPipe[1]))
{ Write-debug \"contain add $($splitPipe[0]) sur $($splitPipe[1])\";$nouvelleListeEtape.Item($splitPipe[1]).Add($splitPipe[0])| Out-Null}
else
{Write-debug \"not contain add $($splitPipe[1]) , $($splitPipe[0])\";$nouvelleListeEtape.Add($splitPipe[1],$splitPipe[0])| Out-Null}
}
}
return $nouvelleListeEtape
}
[/code:1]
Quitte à manipuler des hashtables autant le faire via le parser de PS, c'est plus lisible car moins verbeux.
Je reconnais en même temps que ton besoin est trés simple, mais pas évident à coder sous PS
[edit]
A cette heure ci j'ai une ébauche :
[code:1]
$H=@{}
$Result=gc $fichier|
Foreach {
$Value,$Key=$_ -split \";\"
New-Object PsObject -property @{Value=$Value;Key=$Key}
}|
Foreach { $h.Add( $_.Key,$_.Value)}
[/code:1]
Mais ce n'est pas encore une solution
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- lakcil
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 23
- Remerciements reçus 0
Salut,
tu ajoutes une string en tant que valeur de clé et pas un arraylist:
[code:1]
$nouvelleListeEtape.Item($splitPipe[1]).Add($splitPipe[0])| Out-Null
oui c'est bien ça. La valeur de la clé de mon hashtable est bien un string: le nom du cluster
[/code:1]
Ceci dit, sur le code je n'y trouve presque rien à y redire, propre et structuré.
Mais je m'interroge sur l'objectif de ces instructions :
[code:1]
$splitPipe=$ligne.Split(\";\"«»)
if($splitPipe[0] -ne 0 -and $splitPipe[1] -ne 0)
[/code:1]
Quel est l'objectif de comparer du texte avec un entier.
l'objectif de ces lignes est de s'assurer qu'aucune des valeurs apres un split n'est nul.
j'avoue que la comparaison n'est pas correcte que cela doit se faire sur des caractères nuls
Ensuite de coder à la C# sous PowerShell à ces limites, rien que le debug de ce code m'est laborieux(on n'est pas sous VS) :
[code:1]
function LectureFichierCluster{
param([String]$Fichier)
#Initialise la liste des étapes
$nouvelleListeEtape = New-Object System.Collections.Hashtable
$ligne = (Get-Content $Fichier)[0]
$splitPipe=$ligne.Split(\";\"«»)
if($splitPipe[0] -ne 0 -and $splitPipe[1] -ne 0)
{
$listeElem = New-Object System.Collections.ArrayList
$nouvelleListeEtape.Add($splitPipe[1],$listeElem)
}
foreach ($ligne in Get-Content $Fichier)
{
$splitPipe=$ligne.Split(\";\"«»)
Write-debug \"$splitPipe\"
if($splitPipe[0] -ne 0 -and $splitPipe[1] -ne 0)
{
Write-debug \"if contains $($splitPipe[1])\"
if($nouvelleListeEtape.Contains($splitPipe[1]))
{ Write-debug \"contain add $($splitPipe[0]) sur $($splitPipe[1])\";$nouvelleListeEtape.Item($splitPipe[1]).Add($splitPipe[0])| Out-Null}
else
{Write-debug \"not contain add $($splitPipe[1]) , $($splitPipe[0])\";$nouvelleListeEtape.Add($splitPipe[1],$splitPipe[0])| Out-Null}
}
}
return $nouvelleListeEtape
}
[/code:1]
Quitte à manipuler des hashtables autant le faire via le parser de PS, c'est plus lisible car moins verbeux.
Je reconnais en même temps que ton besoin est trés simple, mais pas évident à coder sous PS
[edit]
A cette heure ci j'ai une ébauche :
[code:1]
$H=@{}
$Result=gc $fichier|
Foreach {
$Value,$Key=$_ -split \";\"
New-Object PsObject -property @{Value=$Value;Key=$Key}
}|
Foreach { $h.Add( $_.Key,$_.Value)}
[/code:1]
Mais ce n'est pas encore une solution<br><br>
Si j'ai bien compris ton debut de code, tu ajoutes au hastable chaque ligne du fichier en valeur, clé. Le problème est que je ne veux aouter qu'une fois un cluster même si on le retrouve sur plusieurs lignes. Voilà pourquoi la clé du hash est le nom du cluster et à chaque fois que je trouve ce cluster dans le fichier, je n'ajoute que le nom de la machine dans un arraylist
Message édité par: Laurent Dardenne, à: 5/09/11 22:43
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Oui, j'ai tenté de coder en condenser, mais en reproduisant le pbLe problème est que je ne veux aouter qu'une fois un cluster même si on le retrouve sur plusieurs lignes.
Une solution très proche de la tienne :
[code:1]
$Fichier=\"c:\temp\fichier.txt\"
@\"
VM0;
VM1;cluster1
VM2;cluster2
;cluster0
VM3;cluster1
VM4;cluster4
VM5;cluster4
\"@ > $Fichier
function ConvertTO-ClusterVMHashtable{
param(
[Parameter(Mandatory = $true,Position=0)]
[ValidateNotNullOrEmpty()]
[String]$Fichier
)
if (Test-Path $Fichier)
{
$H=@{}
Get-Content $Fichier|
Foreach {
Write-Debug (\"Teste la ligne {0}\" -F $_)
$Value,$Key=$_ -split \";\"
#On force l'emission d'une donnée dans le pipe,
#ICI celle-ci n'est pas utilisée par la suite
1
}|
#Filtre les lignes incomplètes
Where {$Value -ne [string]::Empty -and $Key -ne [string]::Empty}|
Foreach {
if ($H.Contains($Key))
{
Write-Debug \"Ajoute '$Value' dans la collection de la clé '$Key'\"
[void]($H.$Key).Add($Value)
}
else
{
Write-Debug \"Crée la collection pour la clé '$Key' et y ajoute '$Value'\"
$H.Add($Key,(New-Object System.Collections.ArrayList))
#ajoute une valeur dans la collection d'une clé de hastable
[void]($H.$Key).Add($Value)
}
}
Return $H
}
else
{Write-Error \"Fichier inexistant: $Fichier\"}
}#ConvertTO-ClusterVMHashtable
ConvertTO-ClusterVMHashtable \"\"
ConvertTO-ClusterVMHashtable $null
$Result=ConvertTO-ClusterVMHashtable $Fichier
$Result
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 6/09/11 17:13
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- lakcil
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 23
- Remerciements reçus 0
Je teste tout ça et je te fais un retour
Connexion ou Créer un compte pour participer à la conversation.
- lakcil
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 23
- Remerciements reçus 0
il marche nickel ta fonction.
j'avais trouvé une solution de contournement mais cela prenait deux fois plus de ligne que ton code et beaucoup moins efficace.
Encore merci c'est pile poil ce que je cherche à faire.
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Hastable contenant u arraylist