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 #23633
par Steve
Réponse de Steve sur le sujet Re:Insérer colonne dans tableau
Bonjour,
J'ai testé ta solution marcci et cela marche pour le choix de la colonne. Je suis confronté à un nouveau problème.
J'ai une bonne dataTable mais je souhaite récupérer de nouvelles infos provenant d'un csv ( ce sont des path et des tailles de dossiers)
Ces infos ne se mettent pas au bon endroit, je m'explique à l'aide d'un exemple :
Il me met le résultat à cet endroit là
J'ai simplement rajouté :
[code:1]
foreach($newLine in $newCsv) #<-- On prend les lignes du CSV
{
$row = $DataBase.Rows | where {$row.path -eq $line.path}
$row = $DataBase.NewRow() #<-- Initialisation d'un objet type DataRow
foreach($column in $DataBase.Columns) #<-- Récupération du nom de chaque colonne
{
$row.$($column.ColumnName) = $newLine.$($column.ColumnName) #<-- On rempli la ligne DataRow
}
$DataBase.Rows.Add($row) #<-- On ajoute la DataRow dans la DataTable
}
[/code:1]
J'aimerais qu'il aille le mettre au bon endroit qui corresponde au path sans pour autant le mettre si il est identique et si c'est un nouveau path qui n'était pas audité, qu'il soit ajouté à la suite .
Si je manque de clarté, dites moi.
( j'ai mis une image de mon résultat car il ne prend pas les tabs sur ce post.
Bonne fin d'aprem
Message édité par: Anoskar, à: 15/05/17 16:10<br><br>Message édité par: Anoskar, à: 15/05/17 16:11
J'ai testé ta solution marcci et cela marche pour le choix de la colonne. Je suis confronté à un nouveau problème.
J'ai une bonne dataTable mais je souhaite récupérer de nouvelles infos provenant d'un csv ( ce sont des path et des tailles de dossiers)
Ces infos ne se mettent pas au bon endroit, je m'explique à l'aide d'un exemple :
Il me met le résultat à cet endroit là
J'ai simplement rajouté :
[code:1]
foreach($newLine in $newCsv) #<-- On prend les lignes du CSV
{
$row = $DataBase.Rows | where {$row.path -eq $line.path}
$row = $DataBase.NewRow() #<-- Initialisation d'un objet type DataRow
foreach($column in $DataBase.Columns) #<-- Récupération du nom de chaque colonne
{
$row.$($column.ColumnName) = $newLine.$($column.ColumnName) #<-- On rempli la ligne DataRow
}
$DataBase.Rows.Add($row) #<-- On ajoute la DataRow dans la DataTable
}
[/code:1]
J'aimerais qu'il aille le mettre au bon endroit qui corresponde au path sans pour autant le mettre si il est identique et si c'est un nouveau path qui n'était pas audité, qu'il soit ajouté à la suite .
Si je manque de clarté, dites moi.
( j'ai mis une image de mon résultat car il ne prend pas les tabs sur ce post.
Bonne fin d'aprem
Message édité par: Anoskar, à: 15/05/17 16:10<br><br>Message édité par: Anoskar, à: 15/05/17 16:11
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 10 mois #23638
par Marc
Réponse de Marc sur le sujet Re:Insérer colonne dans tableau
Salut,
Il y a des petites erreurs dans ton code
[code:1]
$row = $DataBase.Rows | where {$row.path -eq $line.path}
[/code:1]
Cette ligne s'écris plutôt de cette façon:
[code:1]
$row = $DataBase.Rows | where {$_.path -eq $line.path}
[/code:1]
Ensuite dans la foulé tu réaffecte une nouvelle valeur à $row
[code:1]
$row = $DataBase.NewRow() #<-- Initialisation d'un objet type DataRow
[/code:1]
Il faut mettre une condition pour déclencher la réaffectation.
Ca ne va pas solutionner ton problème mais ce sera déjà une bonne avancée.
Continue de chercher, quand j'ai 5 minutes j'essaye de te faire une truc potable.
Il y a des petites erreurs dans ton code
[code:1]
$row = $DataBase.Rows | where {$row.path -eq $line.path}
[/code:1]
Cette ligne s'écris plutôt de cette façon:
[code:1]
$row = $DataBase.Rows | where {$_.path -eq $line.path}
[/code:1]
Ensuite dans la foulé tu réaffecte une nouvelle valeur à $row
[code:1]
$row = $DataBase.NewRow() #<-- Initialisation d'un objet type DataRow
[/code:1]
Il faut mettre une condition pour déclencher la réaffectation.
Ca ne va pas solutionner ton problème mais ce sera déjà une bonne avancée.
Continue de chercher, quand j'ai 5 minutes j'essaye de te faire une truc potable.
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 #23639
par Marc
Réponse de Marc sur le sujet Re:Insérer colonne dans tableau
Donc si j'ai bien compris.
j'ai deux fichiers:
Datable:
[code:1]
path size date
---- ---- ----
e: 50 17/05/2017
c: 60 17/05/2017
d: 70 17/05/2017
[/code:1]
Nouveau CSV:
[code:1]
path size date
---- ---- ----
e: 0 19/05/2017
c: 60 17/05/2017
d: 0 17/05/2017
g: 10 20/05/2017
[/code:1]
Je veux mettre à jour mes path et rajouter les nouveaux:
[code:1]
# On prend les lignes du nouveau fichier
foreach ($ligne in $NewCSV)
{
#On récupère la ligne de la datatale
$row = $DataTable.Rows | where {$_.path -eq $ligne.path}
#On vérifie si une row correspond
if(-not$row)
{
#Si non on en crée un nouvelle
$row=$DataTable.NewRow()
[void]$DataTable.Rows.Add($row)
}
#Pour finir on aporte les modification à la row
foreach($column in $DataTable.Columns)
{
$row.$($column.ColumnName) = $ligne.$($column.ColumnName)
}
}
path size date
---- ---- ----
e: 0 19/05/2017
c: 60 17/05/2017
d: 0 17/05/2017
g: 10 20/05/2017
[/code:1]<br><br>Message édité par: marcci, à: 16/05/17 10:16
j'ai deux fichiers:
Datable:
[code:1]
path size date
---- ---- ----
e: 50 17/05/2017
c: 60 17/05/2017
d: 70 17/05/2017
[/code:1]
Nouveau CSV:
[code:1]
path size date
---- ---- ----
e: 0 19/05/2017
c: 60 17/05/2017
d: 0 17/05/2017
g: 10 20/05/2017
[/code:1]
Je veux mettre à jour mes path et rajouter les nouveaux:
[code:1]
# On prend les lignes du nouveau fichier
foreach ($ligne in $NewCSV)
{
#On récupère la ligne de la datatale
$row = $DataTable.Rows | where {$_.path -eq $ligne.path}
#On vérifie si une row correspond
if(-not$row)
{
#Si non on en crée un nouvelle
$row=$DataTable.NewRow()
[void]$DataTable.Rows.Add($row)
}
#Pour finir on aporte les modification à la row
foreach($column in $DataTable.Columns)
{
$row.$($column.ColumnName) = $ligne.$($column.ColumnName)
}
}
path size date
---- ---- ----
e: 0 19/05/2017
c: 60 17/05/2017
d: 0 17/05/2017
g: 10 20/05/2017
[/code:1]<br><br>Message édité par: marcci, à: 16/05/17 10:16
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 10 mois #23647
par Steve
Réponse de Steve sur le sujet Re:Insérer colonne dans tableau
Bonjour,
Merci Marcci pour tes réponses, je vais tester cela
Merci Marcci pour tes réponses, je vais tester cela
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 10 mois #23652
par Steve
Réponse de Steve sur le sujet Re:Insérer colonne dans tableau
Re,
Voilà j'ai enfin pu faire des tests mais j'ai manqué de clarté dans mon post précédent, j'en suis désolé.
Ce que je recherche c'est de rajouter une colonne et si une/plusieurs lignes se sont ajoutées entre temps, il faut qu'elles soient insérée.
J'ai simulé a la main le résultat que je souhaite obtenir
Au début j'ai un fichier avec une seule colonne de date avec les résultats.( donc les path et la colonne 16/05/2017.
Ensuite, le résultat qui devrait être lorsque je reçois de nouveaux résultats, la colonne vient simplement s'ajouter au fichier de base. Les nouveaux résultats qui n'étaient pas présents lors du précédents résultat s'ajoutent dans la nouvelle colonne
Désolé, c'est une demande assez basique mais je compte approfondir dans ce domaine.
Message édité par: Anoskar, à: 17/05/17 13:57<br><br>Message édité par: Anoskar, à: 17/05/17 13:58
Voilà j'ai enfin pu faire des tests mais j'ai manqué de clarté dans mon post précédent, j'en suis désolé.
Ce que je recherche c'est de rajouter une colonne et si une/plusieurs lignes se sont ajoutées entre temps, il faut qu'elles soient insérée.
J'ai simulé a la main le résultat que je souhaite obtenir
Au début j'ai un fichier avec une seule colonne de date avec les résultats.( donc les path et la colonne 16/05/2017.
Ensuite, le résultat qui devrait être lorsque je reçois de nouveaux résultats, la colonne vient simplement s'ajouter au fichier de base. Les nouveaux résultats qui n'étaient pas présents lors du précédents résultat s'ajoutent dans la nouvelle colonne
Désolé, c'est une demande assez basique mais je compte approfondir dans ce domaine.
Message édité par: Anoskar, à: 17/05/17 13:57<br><br>Message édité par: Anoskar, à: 17/05/17 13:58
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 10 mois #23664
par Marc
Réponse de Marc sur le sujet Re:Insérer colonne dans tableau
A en effet ça change tout !
En fait non ça ne change pas grand chose
Donc:
Ancien csv:
[code:1]
path 18/05/2017 17/05/2017 16/05/2017
----
e: 0 50 21
c: 60 60 52
d: 0 70 85
g: 10
[/code:1]
Nouveau csv:
[code:1]
path 19/05/2017
----
e: 84
c: 78
d: 90
g: 12
h: 75
[/code:1]
[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:\temp\old.csv -UseCulture
$NewCSV = Import-Csv c:\temp\new.csv -UseCulture
$DataBase = ConvertTo-DataTable $OldCSV
DataTable-Update -DataTable $DataBase -NewData $NewCSV -sort
$DataTable|ft -autosize
path 19/05/2017 18/05/2017 17/05/2017 16/05/2017
----
e: 84 0 50 21
c: 78 60 60 52
d: 90 0 70 85
g: 12 10
h: 75
[/code:1]
Par contre il n'y a aucune gestion d'exception, c'est moche.
Alors à toi soit de les gérer soit de faire attention à ce que tu met en input des fonctions.
Pareil pour le classement des colonnes, rien ne dit qu'elles sont toujours dans l'ordre attendu par la fonction, il faut revoir cette cet algo en se basant sur le nom des colonnes et non leur numéro.
Message édité par: marcci, à: 18/05/17 11:55<br><br>Message édité par: marcci, à: 18/05/17 12:00
En fait non ça ne change pas grand chose
Donc:
Ancien csv:
[code:1]
path 18/05/2017 17/05/2017 16/05/2017
----
e: 0 50 21
c: 60 60 52
d: 0 70 85
g: 10
[/code:1]
Nouveau csv:
[code:1]
path 19/05/2017
----
e: 84
c: 78
d: 90
g: 12
h: 75
[/code:1]
[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:\temp\old.csv -UseCulture
$NewCSV = Import-Csv c:\temp\new.csv -UseCulture
$DataBase = ConvertTo-DataTable $OldCSV
DataTable-Update -DataTable $DataBase -NewData $NewCSV -sort
$DataTable|ft -autosize
path 19/05/2017 18/05/2017 17/05/2017 16/05/2017
----
e: 84 0 50 21
c: 78 60 60 52
d: 90 0 70 85
g: 12 10
h: 75
[/code:1]
Par contre il n'y a aucune gestion d'exception, c'est moche.
Alors à toi soit de les gérer soit de faire attention à ce que tu met en input des fonctions.
Pareil pour le classement des colonnes, rien ne dit qu'elles sont toujours dans l'ordre attendu par la fonction, il faut revoir cette cet algo en se basant sur le nom des colonnes et non leur numéro.
Message édité par: marcci, à: 18/05/17 11:55<br><br>Message édité par: marcci, à: 18/05/17 12:00
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.052 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Insérer colonne dans tableau