Advertisements
I am having multiple csv files in a folder with data like below
file1
"Index","Response","Status","Time"
"32190","2","Succeeded","2023-01-18 08:31:34.9"
"32189","3","Succeeded","2023-01-18 08:26:34.9"
"32188","3","Succeeded","2023-01-18 08:21:34.9"
file2
"Index","Response","Status","Time"
"32190","2","Succeeded","2023-01-19 08:31:34.9"
"32189","3","Succeeded","2023-01-19 08:26:34.9"
"32188","3","Succeeded","2023-01-19 08:21:34.9"
Need to merge these files into a single csv with a one header
"Index","Response","Status","Time"
"32190","2","Succeeded","2023-01-18 08:31:34.9"
"32189","3","Succeeded","2023-01-18 08:26:34.9"
"32188","3","Succeeded","2023-01-18 08:21:34.9"
"32190","2","Succeeded","2023-01-19 08:31:34.9"
"32189","3","Succeeded","2023-01-19 08:26:34.9"
"32188","3","Succeeded","2023-01-19 08:21:34.9"
I have this below code but I am not able to get single header in it
$folder = 'D:\reports\daily_csv'
$files = Get-ChildItem $folder\*.csv
Get-Content $files | Set-Content "D:\Monthly\Merged_$prev_month.csv"
Please let me know what I need to add here to avoid multiple headers
>Solution :
Here is one way to do it using StreamReader
and an anonymous function. Note that .OpenText()
initializes the StreamReader
with UTF8 encoding, if that’s a problem you can use StreamReader(String, Encoding)
instead.
$folder = 'D:\reports\daily_csv'
Get-ChildItem $folder\*.csv | & {
begin { $isFirstObject = $true }
process {
try {
$reader = $_.OpenText()
$headers = $reader.ReadLine()
if($isFirstObject) {
$headers
$isFirstObject = $false
}
while(-not $reader.EndOfStream) {
$reader.ReadLine()
}
}
finally {
if($reader) {
$reader.Dispose()
}
}
}
} | Set-Content path\to\mergedCsv.csv