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.