Как я могу объединить несколько файлов CSV, в которых два столбца имеют одинаковые данные, с помощью Powershell - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в PowerShell Topi c, мне просто нужна помощь от вас всех. Мне нужно объединить несколько файлов CSV в папке, в которой эти файлы CSV имеют одинаковые заголовки и разные данные, но в некоторых случаях два или более столбца могут иметь одинаковые данные.

Итак, вот мой код,

$filevalues = Import-Csv -Path  (Get-ChildItem -Path C:\Users\hi\ -Filter '*.csv').FullName

$firstfile = Import-Csv -Path C:\Users\hi\VM1.csv

[String[]]$NamesofApplication = $firstfile.Application;
[String[]]$NamesofFolder = $firstfile.FileName;
[String[]]$NamesofConfigvariable = $firstfile.ConfigVariable;
[String[]]$NamesofVM1 = $filevalues.VM1;
[String[]]$NamesofVM2 = $filevalues.VM2;
[String[]]$NamesofVM3 = $filevalues.VM3;

 Write-Host $NamesofVM1.Count

$array = @();
for($i=0; $i -lt $NamesofApplication.Count ; $i++){
    $hashtable = [pscustomobject]@{Application=$NamesofApplication[$i]; FileName=$NamesofFolder[$i]; ConfigVariable=$NamesofConfigvariable[$i];VM1=$NamesofVM1[$i];VM2=$NamesofVM2[$i];VM3=$NamesofVM3[$i] };
    $array += $hashtable;
};

$array | ForEach-Object { [pscustomobject] $_ } | Export-Csv C:\Users\hi\OutPut.csv

и вот мои VM1.csv, VM2.csv и VM3.csv VM1.csv , VM2.csv , VM3.csv

и я просто хочу, чтобы мой вывод был похож на Output.csv

Кто-нибудь может мне в этом помочь.

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

Попробуйте сценарий под сценарием к сценарию, чтобы объединить несколько файлов CSV в один, добавив каждый файл в конец.

$ getFirstLine = $ true

get-childItem "* .csv" |

foreach {$ filePath = $ _

$lines = Get-Content $filePath  
$linesToWrite = switch($getFirstLine) {
       $true  {$lines}
       $false {$lines | Select -Skip 1}

}


Add-Content "<Location>\<Output File Name>.csv" $linesToWrite

}

Write-Output "New CSV File successfully created"
0 голосов
/ 06 августа 2020

Используя этот Join-Object командлет (см. Также: В Powershell, как лучше всего объединить две таблицы в одну? ):

Если есть нет связи между списком объектов (кроме индекса строки):

$csv1 | Merge-Object $csv2 | Merge-object $csv3 | ConvertTo-Csv -NoTypeInformation

Но я бы посоветовал против этого подхода, поскольку строки должны быть в одном порядке и иметь одинаковую начальную точку. Лучше объединить списки по связанному элементу, например, FileName:

$csv1 | Merge-Object $csv2 -on FileName | Merge-object $csv3 -on FileName | ...

Или несколько свойств как Folder и FileName:

$csv1 | Merge-Object $csv2 -on Folder,FileName | Merge-object $csv3 -on Folder,FileName | ...

Все три команда будет иметь те же результаты:

Appli Folder  FileName Config VM1  VM2  VM3
----- ------  -------- ------ ---  ---  ---
ABC   Folder1 FN1      Con1   VM11 VM11 VM11
      Folder2 FN2      Con2   VM12 VM12 VM12
      Folder3 FN3      Con3   VM13 VM13 VM13
SID   Folder4 FN4      Con4   VM14 VM14 VM14
      Folder5 FN5      Con5   VM15 VM15 VM15

только с последним строки не должны быть в порядке:

0 голосов
/ 05 августа 2020

Если, как в вашем примере, csv можно объединять по строкам, вы можете добавлять данные напрямую с помощью Add-Member . Небольшой пример использования Add-member с данными CSV.

$csv1 = @'
Appli,Folder,FileName,Config,VM1
ABC,Folder1,FN1,Con1,VM11
,Folder2,FN2,Con2,VM12
,Folder3,FN3,Con3,VM13
SID,Folder4,FN4,Con4,VM14
,Folder5,FN5,Con5,VM15
'@ | ConvertFrom-Csv 

$csv2 = @'
Appli,Folder,FileName,Config,VM2
ABC,Folder1,FN1,Con1,VM11
,Folder2,FN2,Con2,VM12
,Folder3,FN3,Con3,VM13
SID,Folder4,FN4,Con4,VM14
,Folder5,FN5,Con5,VM15
'@ | ConvertFrom-Csv 

$csv3 = @'
Appli,Folder,FileName,Config,VM3
ABC,Folder1,FN1,Con1,VM11
,Folder2,FN2,Con2,VM12
,Folder3,FN3,Con3,VM13
SID,Folder4,FN4,Con4,VM14
,Folder5,FN5,Con5,VM15
'@ | ConvertFrom-Csv 


for ($i = 0; $i -lt $csv1.Count; $i++)
{ 
    $csv1[$i] | Add-Member -MemberType NoteProperty -Name VM2 -Value $csv2[$i].VM2
    $csv1[$i] | Add-Member -MemberType NoteProperty -Name VM3 -Value $csv3[$i].VM3
}
$csv1 | ConvertTo-Csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...