CSV 1 has columns a,b,c and csv 2 has columns d,e.
I want to append columns d and e in csv 1.
output would be like
a,b,c,d,e in csv 1
You can use Import-CSV to get the content of both CSVs and combine them with to foreach loops in a custom object. Then you’re able to output it to another CSV.
You can use the search function of this forum to search for some examples … there are many
i am doing this :
function Merge-CSVFiles { [cmdletbinding()] param( [string[]]$CSVFiles, [string]$OutputFile = "c:\merged.csv" ) $Output = @(); foreach($CSV in $CSVFiles) { if(Test-Path $CSV) { $FileName = [System.IO.Path]::GetFileName($CSV) $temp = Import-CSV -Path $CSV | select *, @{Expression={$FileName};Label="FileName"} $Output += $temp } else { Write-Warning "$CSV : No such file found" } } $Output | Export-Csv -Path $OutputFile -NoTypeInformation Write-Output "$OutputFile successfully created" } $file1 = "G:\csv1.txt" # get content of text files from Directory $content = Get-Content "$file1" # Remove first two lines of header. $finalData = $content[2..($content.Count-1)] # For Creating CSV File in same subFolder $finalData | Out-File -FilePath "$file1" -Encoding "UTF8" $file2 = "G:\csv2.txt" # get content of text files from Directory $content1 = Get-Content "$file2" # Remove first two lines of header. $finalData1 = $content1[1..($content1.Count-1)] # For Creating CSV File in same subFolder $finalData1 | Out-File -FilePath "$file2" -Encoding "UTF8" $fileInput = Import-Csv -Delimiter "," -Header @("a","b","c") -Path "G:\csv1.txt" $fileInput | select a,b,c,d | Export-Csv -Path "$file1" -NoTypeInformation -Force -Encoding "UTF8" $fileInput2 = Import-Csv -Delimiter "," -Header @("x","y") -Path "G:\csv2.txt" $fileInput2 | select account,ifsc | Export-Csv -Path "$file2" -NoTypeInformation -Force -Encoding "UTF8" Merge-CSVFiles -CSVFiles "$fileInput","$fileInput2" -OutputFile "G:\output.txt"but its not working!
hmmmm … lets say your csv1 (C:\sample\sample1.csv) looks like this:
a,b,c,d… and your csv2 (C:\sample\sample2.csv) looks like this:
aa1,bb1,cc1,dd1
aa2,bb2,cc2,dd2
d,e,fthen your ps1 could look like this:
dd1,ee1,ff1
dd2,ee2,ff2
$CSV1 = Import-Csv -Path ‘C:\sample\sample1.csv’ -Delimiter ‘,’
$CSV2 = Import-Csv -Path ‘C:\sample\sample2.csv’ -Delimiter ‘,’$Result = Foreach($Item1 in $CSV1){
Foreach($item2 in $CSV2){
If($Item1.d -eq $item2.d){
[PSCustomObject]@{
a = $Item1.a
b = $Item1.b
c = $Item1.c
d = $Item1.d
e = $Item2.e
f = $Item2.f
}
}
}
}
$Result
$Result | Export-Csv -Path ‘C:\sample\sample2.csv’ -NoTypeInformation
Thanks it worked!
Of concern her is the issue of data fidelity. You’re assuming that record 1 of CSV1 corresponds to record 1 of CSV2. If any of the CSVs is sorted, the record order is changed and now the merged data becomes total trash, where you’ll end up with record 1 of the combined CSV being aa1,bb1,cc1,dd3,dd4 instead of aa1,bb1,cc1,dd1,ee1 for example.
We typically guard against that by having one common column is each of the 2 CSVs to be used to join the 2 CSVs (not unlike joining 2 tables in a database)
@Sam,
I showed that for him in my code example and he already approved it. Thanks.