Adding Extra Headers in CSV - powershell

Input CSV:
CHeader1,CHeader2,CHeader3,CHeader4,CHeader5
a1,a2,a3,a4,a5
b1,b2,b3,b4,b5
Output CSV:
PHeader1,PHeader2
CHeader1,CHeader2,CHeader5
a1,a2,a5
b1,b2,b5
Already tried
Import-Csv -Path .\before.csv |
select CHeader1, CHeader2, CHeader5 |
Export-Csv -Path .\after.csv
This produces the file without parent level headers.
Any suggestions to add parent level headers in first line of CSV followed by client headers and then the data?

What you're trying to create there is not actually a CSV, at least not in a way that the *-Csv cmdlets could handle. You can manually create it like this, though:
'PHeader1,PHeader2' | Set-Content '.\after.csv'
Import-Csv '.\before.csv' |
Select-Object CHeader1, CHeader2, CHeader5 |
ConvertTo-Csv -NoType |
Add-Content '.\after.csv'

Related

From a CSV file get the file header and a portion of the file based on starting and ending line number parameters using PowerShell

So I have a very huge CSV file, the first line has the column headers. I want to keep the first line as a header and add a portion of the file from the file's mid-section or perhaps the end. I'm also trying to select only a few of the columns from the file. And finally, it would be great if the solution also changed the file delimiter from a comma to a tab.
I'm aiming for a solution that's a one-liner or perhaps 2?
Non-working Code version 30 ...
Get-Content -Tail 100 filename.csv | Export-Csv -Delimiter "`t" -NoTypeInformation -Path .\filename_out.csv
I'm trying to get a better grip on PowerShell. So far, so good but I'm not quite there yet. But trying to solve such challenges are helping me (and hopefully others) build a good collection of coding idioms. (FYI - the boss is trying PowerShell due to our efforts so.)
OK thanks to iRon tip. Import-CSV defaults to comma separated, the Select-Object -Property get the columns I want, the select -Last gets the last 200 rows, and the Export-CSV changes the delimiter to a tab:
Import-Csv iarf.csv |
Select-Object -Property Id,Name,RecordTypeId,CreatedDate |
select -Last 200 |
Export-Csv -Delimiter "`t" -NoTypeInformation -Path .\iarf100props6.csv
iRon provided the crucial pointer: Using Import-Csv rather than Get-Content allows you to retrieve arbitrary ranges from the original file as objects, if selected via Select-Object, and exporting these objects again via Export-Csv automatically includes a header line whose column names are the input objects' property names, as initially derived from the input file's header line.
In order to select an arbitrary range of rows, combine Select-Object's -Skip and -First parameters:
To only get rows from the beginning, use just -First $count:
To only get rows from the end, use just -Last $count
To get rows in a given range, use just -Skip $startRowMinus1 -First $rangeRowCount
For instance, the following command extracts rows 10 through 30:
Import-Csv iarf.csv |
Select-Object -Property Id,Name,RecordTypeId,CreatedDate -Skip 9 -First 20 |
Export-Csv -Delimiter "`t" -NoTypeInformation -Path .\iarf100props6.csv

Powershell Import-CSV: either reorder columns with no headers or export-CSV with no header

I have a CSV file with no headers in which I need to add a column between the first and second column. I ultimately want to export the file with no headers to the same file name (hence why I'm using Import-CSV vs Get-Content).
Here is the script which adds the new column to the existing file:
(Import-CSV U:\To_Delete\Layer_search\WB_layers-mod.csv) |
Select-Object *,#{Expression={'FALSE'}} |
Export-Csv U:\To_Delete\Layer_search\WB_layers-mod.csv -NoTypeInformation
This adds the a new column as a third column. In doing my googling, I could find no way to reorder the columns without having a header row, so I modified the script as follows:
(Import-CSV U:\To_Delete\Layer_search\WB_layers-mod.csv -header H1, H2)|
Select-Object *,#{Name='H3';Expression={'FALSE'}} |
Select-Object -Property H1, H3, H2 |
Export-Csv U:\To_Delete\Layer_search\WB_layers-mod.csv -NoTypeInformation
This puts the columns in the correct order, but now I want to export the CSV without the header row I added. However, the only suggestions I'm finding are using Get-Content, Convert-to-CSV, and using Skip 1. That won't work for me because I'm only running PS3 and that option is not available until PS5, and I want to save back to the original file name, which you can't do with Get-Content.
I'm probably making this a lot harder than it needs to be, but I would appreciate any suggestions.
Thanks!
Edited to add:
For clarification, here is an example of the CSV file I am importing:
abc,1/1/2012
def,1/2/2012
ghi,1/3/2012
I want to add a column between the first and second columns:
abc,FALSE,1/1/2012
def,FALSE,1/2/2012
ghi,TRUE,1/3/2012
Hopefully this makes more sense.
I'd read Headers H1,H3 and calculate H2 to have them in the proper order directly.
(Import-CSV .\sample.csv -header H1, H3)|
Select-Object H1,#{Name='H2';Expression={'FALSE'}},H3 |
ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content New.csv
Sample output
"abc","FALSE","1/1/2012"
"def","FALSE","1/2/2012"
"ghi","FALSE","1/3/2012"

How to append datatable to existing records in CSV file

I have CSV file MyFile.csv. It contains following data:
RollNumber Name
1 Amol
2 Ravi
Now I am fetching few records from SQL Server as follows:
RollNumber Name
3 Viku
4 Vaibhav
I am not able to find a way to append these new records to existing CSV file. I don't want to repeat header again. I don't have MS Excel, just want to play with CSV. I tried using Add-content, but it didn't worked out.
Since PowerShell v3 the Export-Csv cmdlet has an -Append parameter that allows appending to an existing CSV.
$data | Export-Csv 'MyFile.csv' -Append -NoType
On earlier versions you can work around that by converting the data to CSV, skip the header line, then append to the output file using Add-Content or Out-File -Append:
$data | ConvertTo-Csv -NoType | select -Skip 1 | Add-Content 'MyFile.csv'

Removing Header and Footer from imported .csv

I have 3 .csv files that I am combining into one. This bit of code works:
Get-ChildItem 'C:\Scripts\testing\csvStuffer\temp\Individual.*.csv' |
ForEach-Object {Import-Csv $_} |
Export-Csv -NoTypeInformation 'C:\Scripts\testing\csvStuffer\temp\MergedCsvFiles.csv'
The problem is that each .csv file has a header and a footer.
I do not want to keep the header or footer from any of the files.
Any suggestions of what I need to add to the above code to remove the headers and footers???
Thanks!
This is not the most elegant solution but it worked for my test files.
Get-ChildItem 'C:\Scripts\testing\csvStuffer\temp\Individual.*.csv' |
ForEach-Object {
$filecontent = get-content $_ | select-object -skip 1;
$filecontent | select -First $($filecontent.length -1) | Set-Content -Path $_;
};
Skipping the first line is easy with select-object. Dropping the last line requires a bit more work, but since get-content returns an array of lines, you can just grab all but the last element in that array.
Looks like alroc already gave an answer, but since I already had it written up I figured I'd post this too. It doesn't load it all into a variable, it just reads each file, strips the first and last line of the current file, and then pipes to out-file with -append on it.
gci 'C:\Scripts\testing\csvStuffer\temp\Individual.*.csv' | %{
$(gc $_.fullname|skip 1)|select -First ($(gc $_.fullname|skip 1).count-1)
}|Out-File -Append 'C:\Scripts\testing\csvStuffer\temp\MergedCsvFiles.csv'

Merge One CSV file into another

I have path1\sample1.csv and path2\sample2.csv file with same column attributes. I need to merge both files with different path into path1\sample1.csv using PowerShell.
Something like this?
Import-CSV path\sample1.csv | Export-CSV path1\sample1.csv
Import-CSV path\sample2.csv | Export-CSV path1\sample1.csv -Append -NoTypeInformation