Question [resolu] pb de copie de tableau

Plus d'informations
il y a 3 ans 4 mois #23503 par Lepoulpe
Bonjour,
je viens de me faire avoir comme un Newbie sur une notion toute simple à galérer des heures pour trouver d'où vient le problème.
J'ai trouvé mais je ne comprends pas, c'est pour cela que je vous pose la question.
Je m'explique:

je crée un tableau $Tab1 avec un importcsv qui ressemble à cela

[code:1]$Tab1

Nom Semaine Quantite


BAST 1717 2
MTSS 1717 24
BOIS 1717 12
DLCM2 1717 10
MASAN 1717 3[/code:1]

ensuite je copie mon tableau dans un autre

[code:1]$Tab2 = $Tab1.clone()[/code:1]

et je modifie une des valeurs de $Tab2
[code:1]$Tab2[0].Quantite = 0
$Tab2

Nom Semaine Quantite


BAST 1717 0
MTSS 1717 24
BOIS 1717 12
DLCM2 1717 10
MASAN 1717 3
[/code:1]

Mais du coup si je regarde $Tab1
[code:1]$Tab1

Nom Semaine Quantite


BAST 1717 0
MTSS 1717 24
BOIS 1717 12
DLCM2 1717 10
MASAN 1717 3
[/code:1]

Il est également modifié comme si $Tab2 n'était qu'un pointeur vers $Tab1
J'ai raté quelque chose ?
Comment copier un tableau dans une autre variable ?

J'ai bien vu la doc de Laurent mais visiblement je rate quelque chose
[code:1]$h2=$h
#$h2 pointe sur les mêmes données que $h

$h2=$h.Clone()
#$h2 pointe sur ces propres données recopiées à partir de $h [/code:1]

Merci pour votre retour

Cédric<br><br>Message édité par: Lepoulpe, à: 26/04/17 14:30

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

Plus d'informations
il y a 3 ans 4 mois #23505 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:pb de copie de tableau
Salut
dans le tutoriel que tu références, j'aborde rapido la notion de 'deep copy'.
[code:1]
Function New-rapport{
#New-PSCustomObjectFunction -Noun Rapport -Parameters Nom,Semaine,Quantite -File
param(
[Parameter(Mandatory=$True,position=0)]
$Nom,
[Parameter(Mandatory=$True,position=1)]
$Semaine,
[Parameter(Mandatory=$True,position=2)]
$Quantite
)

[pscustomobject]@{
PSTypeName='Rapport';
Nom=$Nom;
Semaine=$Semaine;
Quantite=$Quantite;
}


}# New-rapport

$tab=@(
New-rapport BAST 1717 2
New-rapport MTSS 1717 24
New-rapport BOIS 1717 12
New-rapport DLCM2 1717 10
New-rapport MASAN 1717 3
)

$T2=$tab.Clone()
$T2[0].Nom='Identique'
$Tab[0]
$T2[0]

#copie des PSObject
#DOC : msdn.microsoft.com/en-us/library/system....t.copy(v=vs.85).aspx
#source : github.com/PowerShell/PowerShell/blob/ma...e/MshObject.cs#L1544

$T2=$tab|% { $_.PSObject.Copy() }
$T2[0].Nom='Change'

$Tab[0]
$T2[0]
[/code:1]
L'exemple que tu cites clone une hashtable. En interne les valeurs scalaires sont recrées, et comme le précisent les commentaires \&quot;This does a shallow copy\&quot;.

Le tuto cible des débutant(e)s ou confirmé(e)s, mais je n'ai pas abordé ce point en détail car c'est du dev 'avancé'. Donc dans le cas de copie d'objet le + souvent il faut faire une deep copy. On parcourt récursivement toutes les propriétées afin d'en recréer des copies. Ainsi on crée de nouvelles références (pointeur/zone mémoire) d'objet.

Enfin dans ton cas on récupère des PSObject on peut donc utiliser la méthode Copie() sur chaque élément du tableau.
Voir aussi .

Note : on peut avoir un pb similaire avec la profondeur de sérialisation...<br><br>Message édité par: Laurent Dardenne, à: 26/04/17 11:50

Tutoriels PowerShell

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

Plus d'informations
il y a 3 ans 4 mois #23506 par Lepoulpe
Réponse de Lepoulpe sur le sujet Re:pb de copie de tableau
Merci Laurent pour la qualité de ta réponse.
C'est vraiment lourd comme méthode juste pour copier un tableau dans une variable.

Du coup n'est-ce pas plus simple de faire un export-CSV ou XML puis un import dans ma nouvelle variable ?
Quelles sont les contre-indications à procéder comme cela mis à part le fait que les données sont écrites (même temporairement) ? Cela sollicite tout de même beaucoup moins de ressources, surtout si le tableau comporte énormément d'entrées...

Cédric

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

Plus d'informations
il y a 3 ans 4 mois #23509 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:pb de copie de tableau
Lepoulpe écrit:

C'est vraiment lourd comme méthode juste pour copier un tableau dans une variable.

Non, c'est du 'bas' niveau. Là on est obligé de préciser les étapes de notre traitement.Ceci dit tu peux l'encapsuler.
Lepoulpe écrit:

Du coup n'est-ce pas plus simple de faire un export-CSV ou XML puis un import dans ma nouvelle variable ?

'Plus simple' je ne sais pas, autrement et avec moins de code surement :-)

Lepoulpe écrit:

Cela sollicite tout de même beaucoup moins de ressources ...

Je ne sais pas, faut réaliser des benchmark :P

Lepoulpe écrit:

Quelles sont les contre-indications à procéder comme cela mis à part le fait que les données sont écrites (même temporairement) ?

L'export-csv ne peut exporter que des objets d'un 'seul niveau'. Le csv n'est pas adapté pour une imbrication d'objets.
La désérialisation perd le type d'origine et modifie le typename.
C'est le contexte et les possibles évolutions du traitement qui détermineront je pense l'usage ou non des cmdlet Export-CSV et Export-Clixml (voir son paramètre -Depth).

Je finalise un tuto sur les PSTypeConverter qui aborde la sérialisation et évite ces 2 inconvénients, mais là on utilise le C#.

note:
depuis la v4 je crois, tu peux utiliser ceci :
[code:1]

$Ip=[IPAddress]'1.2.3.4'
$S = [System.Management.Automation.PSSerializer]::«»Serialize($Ip)
$Ds = [System.Management.Automation.PSSerializer]::«»Deserialize($S)
$ip.gettype().FullName
[/code:1]
Les PSTypeConverter sont utilisés en interne lors de la sérialisation/désérialisation.
Ici on récupère bien le même type car un PSTypeConverter existe :
[code:1]
&lt;Type&gt;
&lt;Name&gt;System.Net.IPAddress&lt;/Name&gt;
&lt;Members&gt;
&lt;ScriptProperty&gt;
&lt;Name&gt;IPAddressToString&lt;/Name&gt;
&lt;GetScriptBlock&gt;
$this.Tostring()
&lt;/GetScriptBlock&gt;
&lt;/ScriptProperty&gt;
&lt;MemberSet&gt;
&lt;Name&gt;PSStandardMembers&lt;/Name&gt;
&lt;Members&gt;
&lt;NoteProperty&gt;
&lt;Name&gt;SerializationDepth&lt;/Name&gt;
&lt;Value&gt;1&lt;/Value&gt;
&lt;/NoteProperty&gt;
&lt;NoteProperty&gt;
&lt;Name&gt;DefaultDisplayProperty&lt;/Name&gt;
&lt;Value&gt;IPAddressToString&lt;/Value&gt;
&lt;/NoteProperty&gt;
&lt;/Members&gt;
&lt;/MemberSet&gt;
&lt;/Members&gt;
&lt;/Type&gt;
&lt;Type&gt;
&lt;Name&gt;Deserialized.System.Net.IPAddress&lt;/Name&gt;
&lt;Members&gt;
&lt;MemberSet&gt;
&lt;Name&gt;PSStandardMembers&lt;/Name&gt;
&lt;Members&gt;
&lt;NoteProperty&gt;
&lt;Name&gt;TargetTypeForDeserialization&lt;/Name&gt;
&lt;Value&gt;Microsoft.PowerShell.DeserializingTypeConverter&lt;/Value&gt;
&lt;/NoteProperty&gt;
&lt;/Members&gt;
&lt;/MemberSet&gt;
&lt;/Members&gt;
&lt;/Type&gt;
[/code:1]
Pour un PSObject imbriqué il faut juste préciser la valeur de SerializationDepth, via un fichier ETS ou via Update-TypeData.
Ceci concerne également les jobs.

Tutoriels PowerShell

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

Plus d'informations
il y a 3 ans 4 mois #23513 par Lepoulpe
Réponse de Lepoulpe sur le sujet Re:pb de copie de tableau
Au top
merci pour toutes ces explications Laurent.
J'y vois un peu plus clair.

Cédric

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

Plus d'informations
il y a 3 ans 4 mois #23537 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:pb de copie de tableau
Pour info .

Tutoriels PowerShell

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

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