Question fusionner 2 fichiers csv par leur 1ere col

Plus d'informations
il y a 14 ans 7 mois #9969 par bouzinhac
Bonjour, bonjour,

Unixien passant sur powershell, j'ai réussi a faire (grâce au site) des choses interessantes (zip, envoie de mail ,remplacement de caracteres ..) mais je suis coincé dans l'utilisation des tableaux.

En fait, mon probleme est de pouvoir fusionner 2 fichiers csv (separation ,) par leur premiere colonne commune aux 2. Car mon tsm ne me permet pas de sortir les données dans un même csv.

Merci pour votre aide.:blink: :silly:

Christophe

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

Plus d'informations
il y a 14 ans 7 mois #9971 par Laurent Dardenne
Peut être un Join-Object ?
Ou encore celui-ci .
A vérifier.

Tutoriels PowerShell

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

Plus d'informations
il y a 14 ans 7 mois #9975 par jojo
hello,

c'est pas du propre mais ça fonctionne :)

[code:1]$a=cat ./1.csv
$b=cat ./2.csv
for($i=0;$i -lt ($a+$b).count;$i++){
if($b[$i] -or $a[$i]) { '{0},{1}' -f $b[$i],$a[$i] }
}
[/code:1]

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

Plus d'informations
il y a 14 ans 7 mois #9976 par Laurent Dardenne
jojo écrit:

mais ça fonctionne :)

Avec quel jeux de tests ?
Ensuite je ne comprend pas, dans ce contexte, l'objectif du code suivant :
[code:1]
$i -lt ($a+$b).count
[/code:1]
Ni ici l'usage du -Or
[code:1]
($b[$i] -or $a[$i])
[/code:1]
La fatigue peut être.
Ton code fait une 'fusion un-un' sans tenir compte de l'égalité du premier champ.
Avec 1.csv :

\"WCL304.wmv\",\"411901061\"
\"WCL321.wmv\",\"350394265\"
\"Write-RemoteDataCollector.ps1\",\"11788\"
\"WSV315-HD.wmv\",\"869950039\"
\"WSV315.pptx\",\"4197491\"
\"WSV406.pptx\",\"3633441\"
\"WSV406.wmv\",\"180505621\"

et 2 csv, avec le même nombre d'éléments, mais des noms différents (juste un copier/coller remanié) :

\"WCL.wmv\",\"411901061\"
\"WCL321.wmv\",\"350394265\"
\"Write-RemoteDataCollector.ps1\",\"11788\"
\"WSV-HD.wmv\",\"869950039\"
\"WSV315.pptx\",\"4197491\"
\"WSV.pptx\",\"3633441\"
\"WSV406.wmv\",\"180505621\"

J'obtiens, avec le code suivant :
[code:1]
$a=cat c:\temp\1.csv
$b=cat c:\temp\2.csv
for($i=0;$i -lt ($a+$b).count;$i++){
Write-warning $i
if($b[$i] -or $a[$i]) { Write-warning \"fusion\";'{0},{1}' -f $b[$i],$a[$i] }
}
[/code:1]
Le résultat suivant :

AVERTISSEMENT : 0
AVERTISSEMENT : fusion
\"WCL.wmv\",\"411901061\",\"WCL304.wmv\",\"411901061\"
AVERTISSEMENT : 1
AVERTISSEMENT : fusion
\"WCL321.wmv\",\"350394265\",\"WCL321.wmv\",\"350394265\"
AVERTISSEMENT : 2
AVERTISSEMENT : fusion
\"Write-RemoteDataCollector.ps1\",\"11788\",\"Write-RemoteDataCollector.ps1\",\"11788\"
AVERTISSEMENT : 3
AVERTISSEMENT : fusion
\"WSV-HD.wmv\",\"869950039\",\"WSV315-HD.wmv\",\"869950039\"
AVERTISSEMENT : 4
AVERTISSEMENT : fusion
\"WSV315.pptx\",\"4197491\",\"WSV315.pptx\",\"4197491\"
AVERTISSEMENT : 5
AVERTISSEMENT : fusion
\"WSV.pptx\",\"3633441\",\"WSV406.pptx\",\"3633441\"
AVERTISSEMENT : 6
AVERTISSEMENT : fusion
\"WSV406.wmv\",\"180505621\",\"WSV406.wmv\",\"180505621\"
AVERTISSEMENT : 7
AVERTISSEMENT : 8
AVERTISSEMENT : 9
AVERTISSEMENT : 10
AVERTISSEMENT : 11
AVERTISSEMENT : 12
AVERTISSEMENT : 13

J'en déduit que cela n'est pas sale, mais juste faux :P
Personellement, c'est le deuxiéme cas qui me gêne le plus.

Une précision, au cas où, l'usage des scripts cités précédement nécessite de construire des objets.
Un exemple basé sur les mêmes fichiers :
[code:1]
Function Join-Object($first=@(),
$second = $(throw \"Please specify a target to join\"«»),
$where={$firstItem -eq $secondItem},
$output={$firstItem})
{
## join-object.ps1
## From www.leeholmes.com/blog/CreatingSQLsJoinl...ctionalityInMSH.aspx
## Outputs the intersection of two lists, based on a given property
##
## Parameters:
## -First: The first set to join with. Defaults to the pipeline if not specified
## -Second: The second set to join with.
## -Where: A script block by which to compare the elements of the two sets.
## -$firstItem refers to the element from 'First'
## -$secondItem refers to the element from 'Second'
## -Output: An expression to execute when the 'Where' expression evaluates to 'True\".
## Defaults to outputting $firstItem if not specified.
##
## Examples:
## \"Hello\",\"World\" | join-object -second:\"World\"
## join-object -first:\"A\",\"E\",\"I\" -second:\"BAT\",\"BUG\",\"BIG\" -where:{$secondItem.Contains $firstItem)} -output:{$secondItem}
##
## $dirset1 = (get-childitem c:\winnt)
## $dirset2 = (get-childitem c:\winnt\system32)
## join-object $dirset1 $dirset2 -where:{$firstItem.Name -eq $secondItem.Name}

if(-not $first)
{
foreach($element in $input) { $first += $element }
}

foreach($firstItem in $first)
{
foreach($secondItem in $second)
{
if(&$where) { & $output }
}
}
}

$A=Get-Content C:\Temp\1.csv|
Foreach-Object {
$T=$_ -split ','
New-object PSObject -Property @{Name=$T[0];Size=$T[1]}
}
$B=Get-Content C:\Temp\2.csv|
Foreach-Object {
$T=$_ -split ','
New-object PSObject -Property @{Name=$T[0];Size=$T[1]}
}
Join-Object $A $B -where:{$firstItem.Name -eq $secondItem.Name}
[/code:1]
Renvoi :

Name Size
---- ----
\"WCL321.wmv\" \"350394265\"
\"Write-RemoteDataCollector.ps1\" \"11788\"
\"WSV315.pptx\" \"4197491\"
\"WSV406.wmv\" \"180505621\"

Ce qui, il me semble, et sans vouloir t'offenser, répond au besoin exprimé ici :
Christophe Bouzinhac écrit:

En fait, mon probleme est de pouvoir fusionner 2 fichiers csv (separation ,) par leur premiere colonne commune aux 2.

Cordialement,
Laurent

Message édité par: Laurent Dardenne, à: 17/08/11 13:39<br><br>Message édité par: Laurent Dardenne, à: 17/08/11 13:40

Tutoriels PowerShell

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

Plus d'informations
il y a 14 ans 7 mois #9977 par bouzinhac
Merci a tous, actuellement en mode de sous effectif j'ai du mettre tout cela en stand by, mais je vous tiens tous au courant

Merci au site et a ses membres
Christophe

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

Plus d'informations
il y a 14 ans 7 mois #9983 par bouzinhac
Désolé, mais malgré mes recherches, j'ai toujours ceci :

PS C:\PowerShell\LATEST&gt; Function Join-Object($first=@(),
&gt;&gt; $second = $(throw \&quot;Please specify a target to join\&quot;),
&gt;&gt; $where={$firstItem -eq $secondItem},
&gt;&gt; $output={$firstItem})
&gt;&gt; {
&gt;&gt;
&gt;&gt; if(-not $first)
&gt;&gt; {
&gt;&gt; foreach($element in $input) { $first += $element }
&gt;&gt; }
&gt;&gt;
&gt;&gt; foreach($firstItem in $first)
&gt;&gt; {
&gt;&gt; foreach($secondItem in $second)
&gt;&gt; {
&gt;&gt; if(&amp;$where) { &amp; $output }
&gt;&gt; }
&gt;&gt; }
&gt;&gt; }
&gt;&gt;
PS C:\PowerShell\LATEST&gt; $A=Get-Content C:\Temp\1.csv|
&gt;&gt; Foreach-Object {
&gt;&gt; $T=$_ -split ','
&gt;&gt; New-object PSObject -Property @{Name=$T[0];Size=$T[1]}
&gt;&gt; }
&gt;&gt; $B=Get-Content C:\Temp\2.csv|
&gt;&gt; Foreach-Object {
&gt;&gt; $T=$_ -split ','
&gt;&gt; New-object PSObject -Property @{Name=$T[0];Size=$T[1]}
&gt;&gt; }
&gt;&gt; Join-Object $A $B -where:{$firstItem.Name -eq $secondItem.Name}
&gt;&gt;
Vous devez fournir une expression de valeur à droite de l'opérateur « - ».
Au niveau de ligne : 3 Caractère : 15
+ $T=$_ -s &lt;&lt;&lt;&lt; plit ','

PS C:\PowerShell\LATEST&gt; dir \temp


Répertoire : Microsoft.PowerShell.Core\FileSystem::C:\temp


Mode LastWriteTime Length Name
----

----
-a--- 28/07/2011 11:19 4690 1.csv
-a--- 25/07/2011 11:58 1432 2.csv


:evil: :evil: :blush:

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

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