[英]How can i merge multiple CSV files in which two columns have same data using Powershell
我對 powershell 主題非常陌生,我只是想得到大家的幫助。 我需要在一個文件夾中合並多個 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
and here is my VM1.csv,VM2.csv and VM3.csv VM1.csv , VM2.csv , VM3.csv
我只希望我的 output 像Output.csv
任何人都可以在這方面幫助我。
如果像在您的示例中一樣, csv 可以逐行合並,您可以直接使用Add-Member添加數據。 使用帶有 csv 數據的 Add-member 的小示例。
$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
嘗試使用以下腳本到腳本將多個 CSV 文件合並為一個 CSV,方法是將每個文件附加到末尾。
$getFirstLine = $true
獲取子項 "*.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"
使用此Join-Object
cmdlet(另請參閱:在 Powershell 中,將兩個表合並為一個的最佳方法是什么? ):
如果 object 列表(其他行索引)之間沒有關系:
$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
只有后者的行不必按順序排列:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.