Question Soucis pour copier 2 tableaux

Plus d'informations
il y a 4 jours 4 heures - il y a 3 jours 10 heures #34416 par Percival
Bonjour à tous , voilà mon petit souci du jour .
Je parse un fichier csv dans un tableau, et j'ai un champs mail qui comporte 1 ou plusieurs adresses mail .
Le but est de détecter les adresses multiples (là pas de soucis), et de recopier la ligne du contact avec chaque champs pour le mail avec chacune des adresse mail renseignée .
Le problème c'est que je me retrouve avec le bon nombre de copies dans mon tableau, mais avec toujours la dernière adr mail de la liste .

Le code est comme ça :
Foreach ( $Champs in $TabIdent ) 
{ 
    ### On teste si champs adresse mail contient plusieurs adresses
    $AllMails = $Champs.$ChampsMailCSV -Split " "    
            
    ### Si plusieurs adresses mails, on copie le destinataire pour chaque mail entré
    If ( $AllMails.Count -gt 1 )
    {        
             
        Foreach ( $Mail in $AllMails )
        {

            If ( ! $Mail -eq "") 
            { 

                $Champs.$ChampsMailCSV = $Mail            
                $TabCSVFinal += $Champs

            }                                 

        }
                
    }

    Else 
    { 
        
        $TabCSVFinal += $Champs

    }
    
}
$TabCSVFinal

J'ai bien dans $AllMails mes différentes adr. Mail à chaque fois,et dans $TabIdent le contenu du csv et de $Champs sont bons .
Si vous avez une idée, merci d'avance .
Je pense que ce sont les mêmes "objets" qui sont copiés, d'où le fait d'en modifier 1, modifie les autres, mais du coup je ne sais pas comment les dissocier .

J'apporte des précisions, car mon explication me semble pas claire :
dans le fichier csv j'ai ce type d'entrées :
nom1;prenom1;adr_mail11
nom2;prenom2;adr_mail21 adr_mail22

Donc je voudrai regénérer un csv du type:
nom1;prenom1;adr_mail11
nom2;prenom2;adr_mail21 
nom2;prenom2;adr_mail22

Et je me trouve avec :
nom1;prenom1;adr_mail11
nom2;prenom2;adr_mail22 
nom2;prenom2;adr_mail22

Car le fait de modifier l'entrée 3 modifie aussi la 2 qui était bonne .
 
Dernière édition: il y a 3 jours 10 heures par Percival.

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

Plus d'informations
il y a 3 jours 10 heures - il y a 3 jours 10 heures #34417 par Fabien
Réponse de Fabien sur le sujet Soucis pour copier 2 tableaux
Bonjour Percival,

Merci pour ces précisions.
Peux-tu nous donner l'intégralité de ton code avec l'import du fichier CSV et la récupération du nom et du prénom stp ?
Dernière édition: il y a 3 jours 10 heures par Fabien.

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

Plus d'informations
il y a 3 jours 9 heures - il y a 3 jours 9 heures #34418 par Percival
Réponse de Percival sur le sujet Soucis pour copier 2 tableaux
Pas de soucis:
$FichierSrc = "C:\test.csv"
$OutputCsv = "C:\ResultatTest.csv"

$TabIdent=Import-CSV -Path $FichierSrc -Delimiter ";" -Encoding UTF7

$AllMails = @()
            
$ChampsCSV = ( Get-Content $FichierSrc )[ 0 ].Split( ";" )
$ValChampsCSV = ( Get-Content $FichierSrc )[ 1 ].Split( ";" )

$IndChamps = 0

Foreach( $Champs in $ValChampsCSV ) 
{ 

   If ( $Champs.IndexOf( "@" ) -gt 0 )  
   {
        
        $ChampsMailCSV = $ChampsCSV[ $IndChamps ]
        
        Break; 
        
   }
   Else { $IndChamps++ }
}

$TabCSVFinal = @()
Foreach ( $Champs in $TabIdent ) 
{ 
    ### On teste si champs adresse mail contient plusieurs adresses
    $AllMails = $Champs.$ChampsMailCSV -Split " "    
            
    ### Si plusieurs adresses mails, on copie le destinataire pour chaque mail entré
    If ( $AllMails.Count -gt 1 )
    {        
             
        Foreach ( $Mail in $AllMails )
        {

            If ( ! $Mail -eq "") 
            { 

                $Champs.$ChampsMailCSV = $Mail            
                $TabCSVFinal += $Champs

            }                                 

        }
                
    }

    Else 
    { 
        
        $TabCSVFinal += $Champs

    }
    
}

$TabCSVFinal

Je vois bien qu'en fait les lignes copiées ne le sont pas au niveau valeurs mais "adresses" .
Donc qd je change un param dans 1 ligne copiée, cela modifie les autres même lignes.
Dsl si le code n'est pas spécialement propre je fais des tests sous ISE .

PS: Pour le moment je contourne le soucis en écrivant directement dans le csv de sortie en append au lieu du tableau .
Dernière édition: il y a 3 jours 9 heures par Percival.

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

Plus d'informations
il y a 3 jours 8 heures #34421 par Fabien
Réponse de Fabien sur le sujet Soucis pour copier 2 tableaux
Merci pour ces informations complémentaires.
Tu peux simplifier grandement ton code.

Voici un exemple de ce que j'ai fait.
Fichier d'entrée CSV : 
Nom;Prenom;Mail
nom1;prenom1;adr_mail11
nom2;prenom2;adr_mail21 adr_mail22

Script PowerShell :
#Import du fichier CSV
$TabIdent = Import-Csv -Path "C:\temp\test.csv" -Delimiter ";"
#Déclaration du tableau
$TabCSVFinal = @()
#Boucle pour chaque ligne du CSV
Foreach ( $Champs in $TabIdent )
{
    #Récupérer toutes les adresses mails dans le champ Mail
    $AllMails = $Champs.Mail -Split " "
    #Boucle pour chaque adresse mail
    foreach ($Mail in $AllMails) {
        #Trier les propiétés dans un ordre bien précis (Nom,Prenom,Mail) et ajouter les valeurs
        $Headers = [ordered]@{'Nom' = $Champs.Nom; 'Prenom' = $Champs.Prenom; 'Mail' = $Mail}
        #Ajouter un Objet avec les propiétés au tableau
        $TabCSVFinal += New-Object -TypeName PSObject -Property $Headers
}
}
# Exporter les données restructurées vers un nouveau fichier CSV
$TabCSVFinal | Export-Csv -Path "C:\Temp\New_test.csv" -Delimiter ";"

Fichier de sortie CSV :
"Nom";"Prenom";"Mail"
"nom1";"prenom1";"adr_mail11"
"nom2";"prenom2";"adr_mail21"
"nom2";"prenom2";"adr_mail22"

J'espère que ça peut t'aider 

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

Plus d'informations
il y a 3 jours 8 heures - il y a 3 jours 8 heures #34423 par Percival
Réponse de Percival sur le sujet Soucis pour copier 2 tableaux
Merci , ça marche pas vraiment avec mon fichier, car tu as mis les champs en dur et ils ne correspondent pas au mien ,(mais rien de grave, j'ai au moins la démarche à suivre) .
Je vais faire un fichier csv générique du coup, pour essayer de comprendre ton code .
Merci en tous cas .

En nommant mes champs comme les tiens ça marche effectivement bien, merci ;)
Dernière édition: il y a 3 jours 8 heures par Percival.

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

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