2017-08-21 5 views
1

J'essaie de trouver un moyen de recueillir des données avant l'exportation pour prendre des données supplémentaires à partir d'un fichier et consolider puis exporter.Consolider les données avec l'importation CSV

Mon code est comme: recherche les utilisateurs et les ordinateurs de nombreuses sources et consolident les données → créer un tableau de 2 colonnes (nom, ordinateur) → exportation que les données à output.log

Parce que les données que je suis à la recherche pour des changements dynamiques de temps en temps je souhaite exécuter le script plusieurs fois par jour, donc la prochaine fois que vous obtenez les données de output.log dans le tableau → continuer à rassembler de nouvelles données et les ajouter dans le output.log existant. Au moment où je suis coincé où chaque fois que je cours le code il écrase le output.log.

Mon code est comme:

Set-Variable -Name Computer -Value @("pc1","pc2") 
Set-Variable -Name LogNames -Value @("something") 

$el_c = @() 
foreach ($comp in $Computer) { 
    foreach ($log in $LogNames) { 
    $el = ... # get data I need from $comp 
    $el_c += $el #consolidating 
    } 
} 

$el_c | %{ 
    $_ | select @{n='Name';e={$_.Properties[0].value}}, @{n='Computer';e={$_.Properties[1].value}} 
} | Export-Csv "C:\test\OutputRaw.log" 
$input = 'C:\test\OutputRaw.log' #TO FILTER OUT DUPLICATION 
$inputCsv = Import-Csv $input | Sort-Object * -Unique 
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -NoTypeInformation 

sortie est:

 
"Name","Computer" 
"Dan","PC1" 
"Tom","PC2" 

Comment puis-je mettre en œuvre avant que l'extrait de fichier également obtenir les données de "output.log" et fusion/ajouter/consolider dans les nouvelles données recueillies?

+0

Comment voulez-vous "consolider" les données? Voulez-vous simplement continuer à ajouter 'output.log'? Ou faut-il omettre de nouvelles données si elles correspondent (ne correspondent pas?) À certaines données existantes? –

+0

la structure de la sortie doit être la même, une colonne de nom et une autre colonne de l'ordinateur. parce que les données importées sont les mêmes que celles qui ont été exportées il y a des heures, je souhaite simplement AJOUTER les nouvelles données dans le fichier. –

+0

Cela ne répond pas à ma question. Souhaitez-vous ajouter TOUTES les nouvelles données ou juste QUELQUES nouvelles données? –

Répondre

0

Merci pour l'aide de Pa ul, j'ai utilisé -Append alors juste ajouté une autre duplication de filtre à la fin.

$el_c | %{ 
    $_ | select @{n='Name';e={$_.Properties[0].value}}, @{n='Computer';e={$_.Properties[1].value}} 
} | Export-Csv "C:\test\OutputRaw.log" 
$input = 'C:\test\OutputRaw.log' 
$inputCsv = Import-Csv $input | Sort-Object * -Unique 
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -Append -NoTypeInformation 
$input = 'C:\test\OutputFinal.log' 
$inputCsv = Import-Csv $input | Sort-Object * -Unique 
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -NoTypeInformation 
0

Utilisez le -Append paramètre de Export-CSV:

Export-Csv "C:\test\Output.log" -Append 
+0

Presque bon, le problème, il va ajouter les nouvelles données au bas du fichier et je suis toujours coincé avec des duplications potentielles –

0

Présumant qu'un journal (je l'ai appelé Log.csv) est déjà créé ($Computer | Export-CSV .\Log.csv):

Import-CSV .\Log.csv | LeftJoin $Computer Name -Merge {$Right.$_} | Export-CSV .\Log.csv 

Pour plus de détails sur LeftJoin (Join-Object), voir: https://stackoverflow.com/a/45483110/1701026

0

Utilisez un pipeline et Compare-Object. Déplacez l'instruction select dans la boucle interne foreach.

$Computer = 'pc1', 'pc2' 
$LogNames = 'something' 

$csv = 'C:\test\OutputFinal.log' 
$ref = Import-Csv $csv 

$Computer | ForEach-Object { 
    $comp = $_ 
    foreach ($log in $LogNames) { 
    ... |  # get data from $comp 
     select @{n='Name';e={$_.Properties[0].value}}, 
      @{n='Computer';e={$_.Properties[1].value}} 
    } 
} | Where-Object { 
    Compare-Object $_ $ref -Property 'Name','Computer' -IncludeEqual -ExcludeDifferent 
} | Export-Csv $csv -Append -NoType