Question Hastable contenant u arraylist

Plus d'informations
il y a 14 ans 8 mois #10191 par lakcil
Salut à tous et à toutes,
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.

Plus d'informations
il y a 14 ans 8 mois #10192 par xyz
Réponse de xyz sur le sujet Re:Hastable contenant u arraylist
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
[/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 :sick: (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 :whistle:
[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 :dry:<br><br>Message édité par: Laurent Dardenne, à: 5/09/11 22:43

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 8 mois #10193 par lakcil
Réponse de lakcil sur le sujet Re:Hastable contenant u arraylist
Laurent Dardenne écrit:

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(\&quot;;\&quot;«»)
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 :sick: (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(\&quot;;\&quot;«»)
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(\&quot;;\&quot;«»)
Write-debug \&quot;$splitPipe\&quot;
if($splitPipe[0] -ne 0 -and $splitPipe[1] -ne 0)
{
Write-debug \&quot;if contains $($splitPipe[1])\&quot;
if($nouvelleListeEtape.Contains($splitPipe[1]))
{ Write-debug \&quot;contain add $($splitPipe[0]) sur $($splitPipe[1])\&quot;;$nouvelleListeEtape.Item($splitPipe[1]).Add($splitPipe[0])| Out-Null}
else
{Write-debug \&quot;not contain add $($splitPipe[1]) , $($splitPipe[0])\&quot;;$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 :whistle:
[edit]
A cette heure ci j'ai une ébauche :
[code:1]
$H=@{}
$Result=gc $fichier|
Foreach {
$Value,$Key=$_ -split \&quot;;\&quot;
New-Object PsObject -property @{Value=$Value;Key=$Key}
}|
Foreach { $h.Add( $_.Key,$_.Value)}
[/code:1]
Mais ce n'est pas encore une solution :dry:&lt;br&gt;&lt;br&gt;

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.

Plus d'informations
il y a 14 ans 8 mois #10202 par xyz
Réponse de xyz sur le sujet Re:Hastable contenant u arraylist
lakcil écrit:

Le problème est que je ne veux aouter qu'une fois un cluster même si on le retrouve sur plusieurs lignes.

Oui, j'ai tenté de coder en condenser, mais en reproduisant le pb :)
Une solution très proche de la tienne :
[code:1]
$Fichier=\&quot;c:\temp\fichier.txt\&quot;

@\&quot;
VM0;
VM1;cluster1
VM2;cluster2
;cluster0
VM3;cluster1

VM4;cluster4
VM5;cluster4
\&quot;@ &gt; $Fichier

function ConvertTO-ClusterVMHashtable{
param(
[Parameter(Mandatory = $true,Position=0)]
[ValidateNotNullOrEmpty()]
[String]$Fichier
)
if (Test-Path $Fichier)
{
$H=@{}
Get-Content $Fichier|
Foreach {
Write-Debug (\&quot;Teste la ligne {0}\&quot; -F $_)
$Value,$Key=$_ -split \&quot;;\&quot;
#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 \&quot;Ajoute '$Value' dans la collection de la clé '$Key'\&quot;
[void]($H.$Key).Add($Value)
}
else
{
Write-Debug \&quot;Crée la collection pour la clé '$Key' et y ajoute '$Value'\&quot;
$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 \&quot;Fichier inexistant: $Fichier\&quot;}
}#ConvertTO-ClusterVMHashtable

ConvertTO-ClusterVMHashtable \&quot;\&quot;
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.

Plus d'informations
il y a 14 ans 8 mois #10203 par lakcil
Réponse de lakcil sur le sujet Re:Hastable contenant u arraylist
Merci pour tes réponses,
Je teste tout ça et je te fais un retour

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 8 mois #10204 par lakcil
Réponse de lakcil sur le sujet Re:Hastable contenant u arraylist
:)
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.

Temps de génération de la page : 0.046 secondes
Propulsé par Kunena