Question Insérer colonne dans tableau

Plus d'informations
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 ! :p

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.

Plus d'informations
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.

La pièce jointe csv-5e6c259b857807b611a08ea5fa302f10.zip est absente ou indisponible

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

Plus d'informations
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.

Plus d'informations
il y a 8 ans 9 mois #23717 par Steve
Réponse de Steve sur le sujet Re:Insérer colonne dans tableau
Bonjour,

Je viens enfin d'avoir du temps pour continuer, je viens de tester exactement avec ton code / fichier et voici le résultat :
[img size=150] [/img]

Il met les colonnes mais pas leur contenu, j'ai commis une erreur ou mal compris ? Je me suis assuré que tout était bien identique
Pièces jointes :

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

Plus d'informations
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.

Plus d'informations
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.


Pièces jointes :

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

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