Question
fusionner 2 fichiers csv par leur 1ere col
- bouzinhac
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
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.
Christophe
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- jojo
-
- Hors Ligne
- Membre elite
-
- Messages : 187
- Remerciements reçus 0
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Avec quel jeux de tests ?mais ça fonctionne
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 :
et 2 csv, avec le même nombre d'éléments, mais des noms différents (juste un copier/coller remanié) :\"WCL304.wmv\",\"411901061\"
\"WCL321.wmv\",\"350394265\"
\"Write-RemoteDataCollector.ps1\",\"11788\"
\"WSV315-HD.wmv\",\"869950039\"
\"WSV315.pptx\",\"4197491\"
\"WSV406.pptx\",\"3633441\"
\"WSV406.wmv\",\"180505621\"
J'obtiens, avec le code suivant :\"WCL.wmv\",\"411901061\"
\"WCL321.wmv\",\"350394265\"
\"Write-RemoteDataCollector.ps1\",\"11788\"
\"WSV-HD.wmv\",\"869950039\"
\"WSV315.pptx\",\"4197491\"
\"WSV.pptx\",\"3633441\"
\"WSV406.wmv\",\"180505621\"
[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 :
J'en déduit que cela n'est pas sale, mais juste fauxAVERTISSEMENT : 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
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 :
Ce qui, il me semble, et sans vouloir t'offenser, répond au besoin exprimé ici :Name Size
---- ----
\"WCL321.wmv\" \"350394265\"
\"Write-RemoteDataCollector.ps1\" \"11788\"
\"WSV315.pptx\" \"4197491\"
\"WSV406.wmv\" \"180505621\"
Christophe Bouzinhac écrit:
Cordialement,En fait, mon probleme est de pouvoir fusionner 2 fichiers csv (separation ,) par leur premiere colonne commune aux 2.
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.
- bouzinhac
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
Merci au site et a ses membres
Christophe
Connexion ou Créer un compte pour participer à la conversation.
- bouzinhac
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
PS C:\PowerShell\LATEST> Function Join-Object($first=@(),
>> $second = $(throw \"Please specify a target to join\"),
>> $where={$firstItem -eq $secondItem},
>> $output={$firstItem})
>> {
>>
>> if(-not $first)
>> {
>> foreach($element in $input) { $first += $element }
>> }
>>
>> foreach($firstItem in $first)
>> {
>> foreach($secondItem in $second)
>> {
>> if(&$where) { & $output }
>> }
>> }
>> }
>>
PS C:\PowerShell\LATEST> $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}
>>
Vous devez fournir une expression de valeur à droite de l'opérateur « - ».
Au niveau de ligne : 3 Caractère : 15
+ $T=$_ -s <<<< plit ','
PS C:\PowerShell\LATEST> 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
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- fusionner 2 fichiers csv par leur 1ere col