Question Changement de type ?

Plus d'informations
il y a 4 ans 4 mois #29518 par Troxsa
Changement de type ? a été créé par Troxsa
Bonjour,

Je recherche comment faire en powershell depuis un DataGridView le transformer en Datatable

J'ai en Powershell un DataGridView pour la rapidité de chargement d'un fichier CSV (Propriété DataSource)
et pour des besoins de rapidité (croisement de données) j'ai besoin de convertir les données en Datatable, en C# et vb.net il semble exister pour faire la conversion.
Je ne trouve pas comment faire en Powershell cette conversion.
j'ai fait plusieurs tentative mais sans réussite.


www.powershell-scripting.com/index.php?o...;id=5486&catid=6

En vous remerciant d'avance<br><br>Message édité par: Troxsa, à: 19/12/19 15:00

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

Plus d'informations
il y a 4 ans 4 mois #29523 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Changement de type ?
Salut,
Troxsa écrit:

Je ne trouve pas comment faire en Powershell cette conversion.
j'ai fait plusieurs tentative mais sans réussite.

Pour comprendre ta demande j'ai fait aussi + tentatives mais sans réussite :whistle:
Tu parts d'où ( ton code) et pour arriver où ?
\&quot;convertir les données en Datatable\&quot; bah faut déjà savoir lesquelles et pouvoir les tester.
Et quel est l'objectif ?

Tutoriels PowerShell

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

Plus d'informations
il y a 4 ans 4 mois #29529 par Troxsa
Réponse de Troxsa sur le sujet Re:Changement de type ?
Bonjour Laurent,

J'ai un traitement de fichier CSV, plusieurs centaines ... entre 30 lignes et 500 lignes et les performances de traitement ne sont pas terrible terrible.

Les fichiers CSV ont le format suivant :

Fichier 1 :
Machine; IP; Disk
Host1; 127.0.0.1; 123
Host2; 127.0.0.1; 456
Host3; 127.0.0.1; 789
...
Host8; 127.0.0.1; 147
...

Fichier 2 :
Machine; IP; USB
Host1; 127.0.0.1; 3
Host2; 127.0.0.1; 7
...
Host8; 127.0.0.1; 5
...

et ainsi de suite, et je cherche a faire un fichier qui résulte l'ensemble des fichiers qui pourrais ressembler a

Fichier 2 :
Machine; IP; Disk; USB
Host1; 127.0.0.1; 123; 3
Host2; 127.0.0.1; 456; 7
Host3; 127.0.0.1; 789; .
...
Host8; 127.0.0.1; 147; 5
...

J'ai fait un premier traitement qui charge le premier fichier CSV puis dans le deuxième fichier je fais une comparaison des valeurs Machine et IP si ça correspond met la valeur de la colonne 3 du fichier 2
(Dans le fichier 2 il n'y a pas les informations \&quot;host3\&quot;)

Le Script ressemble a : (j'ai changé certaines informations)


[code:1]$StartScript = Get-Date -Format \&quot;hh:mm:«»ss\&quot;

$csv = Get-ChildItem \&quot;.\*_tabl.csv\&quot;

$Test = @()

foreach($item in $csv)
{

if($Test.Count -eq 0)
{
$Test += Import-Csv -Path $item.FullName -Delimiter \&quot;,\&quot;
}
else
{
$OtherFile = Import-Csv -Path $item.FullName -Delimiter \&quot;,\&quot;
$NewHeader = (($OtherFile | gm) | Where-Object {$_.MemberType -eq \&quot;NoteProperty\&quot; -and $_.Name -ne \&quot;MACHINE\&quot; -and $_.Name -ne \&quot;IP\&quot;}).Name
$test | Add-Member -NotePropertyName $NewHeader -NotePropertyValue \&quot; \&quot;

foreach($xx in $OtherFile)
{
$Resultat = $Test | Where-Object {$_.MACHINE-EQ ($xx.MACHINE) -and $_.IP -EQ $xx.IP}
if($Resultat -eq $null)
{
# DANS LE CAS OU LA LIGNE N'EXISTE PAS (A VOIR PLUS TARD)
#$Test += $xx.MACHINE

}
$Resultat.$NewHeader = $xx.$NewHeader
}
$test
}
}
$StartScript
Get-Date -Format \&quot;hh:mm:«»ss\&quot;[/code:1]


Sauf que les controles (vérifications) sont vraiment lente
plus de 3 heures pour faire 11 fichiers, je recherche donc un autre moyen pour faire le traitement plus rapide et je me suis penché sur DATATABLE

Le datatable n'a pas le propriété DataSource j'ai donc utilisé le DataGridView


J'ai donc fait

[code:1][System.Collections.ArrayList]$dd = Import-Csv -Path \&quot;.\*fichier.csv\&quot; -Delimiter \&quot;,\&quot; -Encoding Default
$form = New-Object System.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(900,600)


$dataGridView = New-Object System.Windows.Forms.DataGridView -Property @{
Size=New-Object System.Drawing.Size(800,400)
ColumnHeadersVisible = $true
DataSource = $dd
}[/code:1]

pour faire des recherches, des traitements (insert, ...) j'ai besoin de faire cette convertion du DataGridView vers datatable et je pourrais faire un truc dans l'exemple que j'ai trouvé :

# Uses SQL syntax
$dt.Select(\&quot;Genre like '%Rap'\&quot;)
$dt.Select(\&quot;ReleaseYear &gt; 1988\&quot;)
$dt.Select(\&quot;Artist = 'Poison'\&quot;)
# Change Eazy-E's genre
$eazy = ($dt.Select(\&quot;Artist = 'Eazy-E'\&quot;))
$eazy[0][\&quot;Genre\&quot;] = \&quot;West Coast Rap\&quot;
# Find this new genre
$dt.Select(\&quot;Genre like '%Coast%'\&quot;)

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

Plus d'informations
il y a 4 ans 4 mois #29556 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Changement de type ?
Aborde le pb autrement :
[code:1]
#https://www.powershellgallery.com/packages/PSSQLite/1.0.1/Content/Out-DataTable.ps1
$Datas = Import-Csv -Path \&quot;c:\temp\datas.csv\&quot; -Delimiter \&quot;;\&quot; -Encoding Default
$Dt=Out-DataTable -InputObject $Datas
$Dt
[/code:1]

Machine IP Disk


-- ----
Host1 127.0.0.1 123
Host2 127.0.0.1 456
Host3 127.0.0.1 789

Tu as aussi OLEDB, tu trouveras qq exemples sur les forums de ce site.

Tutoriels PowerShell

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

Plus d'informations
il y a 4 ans 4 mois #29557 par Troxsa
Réponse de Troxsa sur le sujet Re:Changement de type ?
Effectivement ça a l'air d’être beaucoup plus simple avec ça

Je vois dans le code qu'il fait un export XML pour le réutiliser je vais voir si je peux pas utiliser juste cette partie là

Merci Laurent je pense qu'avec ça je ne vais plus avoir de problème de traitement.

Bonne journée

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

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