Question
Insérer colonne dans tableau
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 8 ans 10 mois #23690
par Steve
Réponse de Steve sur le sujet Re:Insérer colonne dans tableau
Bonjour, désolé de ma réponse tardive mais j'ai testé le jour même. je vais redoubler d'effort pour atteindre ce niveau ! 
Je te remercie pour ton aide.
Par contre et c'est certainement une notion qui m'échappe mais j'ai une erreur qui se produit lorsque je lance ce code :
La propriété «path» est introuvable dans cet objet. Vérifiez qu’elle existe et qu’elle peut être définie.Au caractère Il fait référence @ :
[code:1]foreach($column in $DataTable.Columns)
{
if($column.ColumnName -eq $NewcolumnName.name)
{
$row.path = $line.path <---
$row.$($column.ColumnName) = $line.$($column.ColumnName)
}
}
} [/code:1]
Aussi il me rale dessus pour un champs juste à la ligne du dessous :
La propriété «16/05/2017 17/05/2017» est introuvable dans cet objet. Vérifiez qu’elle existe et qu’elle peut être définie.Au caractère
Je me demande si cela ne provient pas de mon csv.
Je te remercie pour ton aide.
Par contre et c'est certainement une notion qui m'échappe mais j'ai une erreur qui se produit lorsque je lance ce code :
La propriété «path» est introuvable dans cet objet. Vérifiez qu’elle existe et qu’elle peut être définie.Au caractère Il fait référence @ :
[code:1]foreach($column in $DataTable.Columns)
{
if($column.ColumnName -eq $NewcolumnName.name)
{
$row.path = $line.path <---
$row.$($column.ColumnName) = $line.$($column.ColumnName)
}
}
} [/code:1]
Aussi il me rale dessus pour un champs juste à la ligne du dessous :
La propriété «16/05/2017 17/05/2017» est introuvable dans cet objet. Vérifiez qu’elle existe et qu’elle peut être définie.Au caractère
Je me demande si cela ne provient pas de mon csv.
Connexion ou Créer un compte pour participer à la conversation.
- Marc
- Hors Ligne
- Membre premium
-
Réduire
Plus d'informations
- Messages : 90
- Remerciements reçus 0
il y a 8 ans 10 mois #23691
par Marc
Réponse de Marc sur le sujet Re:Insérer colonne dans tableau
A mon avis tu ne rentre pas les bons object.
J'ai été au plus simple dans la fonction DataTable-Update
Elle attend 2 objects:
- Une DataTable
- Un CSV
La DataTable doit être fournis pas ConverteTo-DataTable qui attend un CSV.
Et tes CSV doivent être strictement de la forme que tu donne le 17/05/2017 à 13h58.
Je te joint les csv que j'ai utiliser pour tester.
J'ai été au plus simple dans la fonction DataTable-Update
Elle attend 2 objects:
- Une DataTable
- Un CSV
La DataTable doit être fournis pas ConverteTo-DataTable qui attend un CSV.
Et tes CSV doivent être strictement de la forme que tu donne le 17/05/2017 à 13h58.
Je te joint les csv que j'ai utiliser pour tester.
La pièce jointe csv-5e6c259b857807b611a08ea5fa302f10.zip est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 8 ans 9 mois #23702
par Steve
Réponse de Steve sur le sujet Re:Insérer colonne dans tableau
Merci pour la réponse, je teste cela et reviens faire le feedback.
Connexion ou Créer un compte pour participer à la conversation.
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 8 ans 9 mois #23717
par Steve
Réponse de Steve sur le sujet Re:Insérer colonne dans tableau
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Marc
- Hors Ligne
- Membre premium
-
Réduire
Plus d'informations
- Messages : 90
- Remerciements reçus 0
il y a 8 ans 9 mois #23718
par Marc
Réponse de Marc sur le sujet Re:Insérer colonne dans tableau
Tu peux poster le code qui retourne ce résultat ?<br><br>Message édité par: marcci, à: 31/05/17 15:36
Connexion ou Créer un compte pour participer à la conversation.
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 8 ans 9 mois #23719
par Steve
Réponse de Steve sur le sujet Re:Insérer colonne dans tableau
Bonsoir, Oui voici mais mis à part la dernière ligne ou tu autosize la variable $dataTable ( à mon avis tu voulais mettre $dataBase).
Voici :
[code:1]
#Nous avons déjà notre petite fonction qui convertis #un csv en datatable:
function ConvertTo-DataTable
{
param
(
[parameter(Mandatory=$true)]
[psobject]$Object
)
begin
{
$DataTable = New-Object System.Data.DataTable
$columns = $Object|Get-Member -MemberType Properties
}
process
{
foreach($column in $columns)
{
[void]$DataTable.Columns.Add($column.Name)
}
foreach($line in $Object)
{
$row = $DataTable.NewRow()
foreach($column in $DataTable.Columns)
{
$row.$($column.ColumnName) = $($line.$($column.ColumnName))
}
[void]$DataTable.Rows.Add($row)
}
}
end
{
return ,$DataTable
}
}
#On rajoute une fonction qui update notre datatable:
function DataTable-Update
{
param
(
[parameter(Mandatory=$true,Position=0)]
[System.Data.DataTable]$DataTable,
[parameter(Mandatory=$true,Position=1)]
[psobject]$NewData,
[switch]$FromCSV,
[switch]$sort
)
begin
{
if($FromCSV)
{
$NewData = Import-Csv $NewData -UseCulture
}
}
process
{
#On récupère le nom de la nouvelle colonne
$NewcolumnName = $NewData|Get-Member -MemberType Properties|where{$_.name -ne 'path'}|select name
#On ajoute une nouvelle colonne avec le nouveau nom
[void]$DataTable.Columns.Add($NewcolumnName.name)
foreach ($line in $NewData)
{
#On récupère la ligne de la datatable
$row = $DataTable.Rows | where {$_.path -eq $line.path}
#On vérifie si une row correspond
if(-not$row)
{
#si non on en crée une nouvelle
$row=$DataTable.NewRow()
[void]$DataTable.Rows.Add($row)
}
#On apporte les modifications des row de la nouvelle collonne
foreach($column in $DataTable.Columns)
{
if($column.ColumnName -eq $NewcolumnName.name)
{
$row.path = $line.path
$row.$($column.ColumnName) = $line.$($column.ColumnName)
}
}
}
}
end
{
#On place la nouvelle colonne où il faut
$Newcolumn = $DataTable.Columns|where{$_.ColumnName -eq $NewcolumnName.name}
$Newcolumn.SetOrdinal($DataTable.Columns.Count-2)
#Et enfin on range les colonnes dans le bon ordre
if($sort)
{
$count = 0
while($count -le $DataTable.Columns.Count-1)
{
$Coltemp = $DataTable.Columns|where{$_.ordinal -eq $DataTable.Columns.Count-1}
$Coltemp.Setordinal($count)
$count++
}
}
}
}
# Ce qui donne
$OldCSV = Import-Csv C:\Labs\old.csv -UseCulture
$NewCSV = Import-Csv C:\Labs\new.csv -UseCulture
$DataBase = ConvertTo-DataTable $OldCSV
DataTable-Update -DataTable $DataBase -NewData $NewCSV -sort
$DataBase|ft -autosize
[/code:1]
Et voici le résultat ( je viens de tester sur un autre environnement plus récent afin d'éviter tout conflit.
Voici :
[code:1]
#Nous avons déjà notre petite fonction qui convertis #un csv en datatable:
function ConvertTo-DataTable
{
param
(
[parameter(Mandatory=$true)]
[psobject]$Object
)
begin
{
$DataTable = New-Object System.Data.DataTable
$columns = $Object|Get-Member -MemberType Properties
}
process
{
foreach($column in $columns)
{
[void]$DataTable.Columns.Add($column.Name)
}
foreach($line in $Object)
{
$row = $DataTable.NewRow()
foreach($column in $DataTable.Columns)
{
$row.$($column.ColumnName) = $($line.$($column.ColumnName))
}
[void]$DataTable.Rows.Add($row)
}
}
end
{
return ,$DataTable
}
}
#On rajoute une fonction qui update notre datatable:
function DataTable-Update
{
param
(
[parameter(Mandatory=$true,Position=0)]
[System.Data.DataTable]$DataTable,
[parameter(Mandatory=$true,Position=1)]
[psobject]$NewData,
[switch]$FromCSV,
[switch]$sort
)
begin
{
if($FromCSV)
{
$NewData = Import-Csv $NewData -UseCulture
}
}
process
{
#On récupère le nom de la nouvelle colonne
$NewcolumnName = $NewData|Get-Member -MemberType Properties|where{$_.name -ne 'path'}|select name
#On ajoute une nouvelle colonne avec le nouveau nom
[void]$DataTable.Columns.Add($NewcolumnName.name)
foreach ($line in $NewData)
{
#On récupère la ligne de la datatable
$row = $DataTable.Rows | where {$_.path -eq $line.path}
#On vérifie si une row correspond
if(-not$row)
{
#si non on en crée une nouvelle
$row=$DataTable.NewRow()
[void]$DataTable.Rows.Add($row)
}
#On apporte les modifications des row de la nouvelle collonne
foreach($column in $DataTable.Columns)
{
if($column.ColumnName -eq $NewcolumnName.name)
{
$row.path = $line.path
$row.$($column.ColumnName) = $line.$($column.ColumnName)
}
}
}
}
end
{
#On place la nouvelle colonne où il faut
$Newcolumn = $DataTable.Columns|where{$_.ColumnName -eq $NewcolumnName.name}
$Newcolumn.SetOrdinal($DataTable.Columns.Count-2)
#Et enfin on range les colonnes dans le bon ordre
if($sort)
{
$count = 0
while($count -le $DataTable.Columns.Count-1)
{
$Coltemp = $DataTable.Columns|where{$_.ordinal -eq $DataTable.Columns.Count-1}
$Coltemp.Setordinal($count)
$count++
}
}
}
}
# Ce qui donne
$OldCSV = Import-Csv C:\Labs\old.csv -UseCulture
$NewCSV = Import-Csv C:\Labs\new.csv -UseCulture
$DataBase = ConvertTo-DataTable $OldCSV
DataTable-Update -DataTable $DataBase -NewData $NewCSV -sort
$DataBase|ft -autosize
[/code:1]
Et voici le résultat ( je viens de tester sur un autre environnement plus récent afin d'éviter tout conflit.
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.053 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Insérer colonne dans tableau