Update: There’s a “part two” now. See the link at the bottom of this post.
I was sitting here, and I wondered, how do I get a hash table into a CSV? Have I even ever done that? Now, a few commands in, and I can’t even remember why I wondered that. There was a reason, I just wish I could remember what it was. Whatever it was, I should be more likely to remember how to get a hash table into CSV when I need it after today’s post. Was it on-disk storage for a hash table for some software configuration? Ugh, what was it?
Anyway, let’s start by assigning a hash table to a variable. Maybe it’ll come back to me.
$HashTable = @{ Name = 'Tommy' StreetName = 'Vista Pl.' City = 'Tucson' } $HashTable Name Value ---- ----- Name Tommy StreetName Vista Pl. City Tucson
Now that we’ve assigned our $HashTable variable the value of our hash table, we can try and get it into a CSV. At first, someone might try the below option. Let’s see how that works.
$HashTable | Export-Csv -NoTypeInformation -Path .\Desktop\HashToCsv.csv
As you can see, this doesn’t work.
In order to get this to work properly, we need to use the GetEnumerator method. I seem to use this quite often. This allows us to walk through each key-pair in our hash table.
$HashTable.GetEnumerator() | Export-Csv -NoTypeInformation -Path .\Desktop\HashToCsv2.csv
Now it’s just perfect, minus the whole Name property (column). Huh? I only expected the Keys and Values, like we’d see produced onscreen. With this in mind, let’s instead pipe to the Select-Object cmdlet before Export-Csv and get things properly filtered.
Update: It dawned on me, after I made all these screen captures, that I wasn’t expecting to see the above Name property included. Sure, it holds the same values as Name, but in a host program, we’re actually accustomed to seeing Name and Value, not Key and Value.
$HashTable.GetEnumerator() | Select-Object -Property Key,Value | Export-Csv -NoTypeInformation -Path .\Desktop\HashToCsv3.csv
My next logical thought was, can we use calculated properties? Can I use a different descriptor than Key and Value? You bet we can — take a look.
$HashTable.GetEnumerator() | Select-Object -Property @{N='Property';E={$_.Key}}, @{N='PropValue';E={$_.Value}} | Export-Csv -NoTypeInformation -Path .\Desktop\HashToCsv4.csv
So yeah, there we go. I can use a hash table, saved to disk, for … whatever reason. I still don’t remember why I wondered this originally, but in case it’s helpful, I know where to find this when I remember why I wondered.
Update: There’s a follow-up post now that includes an easier way.
Just what I needed…thank you! Straight and to the point.
Thank you for the comment. It provided me an opportunity to make some corrections, unsurprisingly.
In case anyone is interested, I have a very slightly simplified one-liner to do this same thing:
[PSCustomObject]($hashTable.GetEnumerator() | Select-Object Name,Value) | Export-CSV -Path file.csv
Excellent, very useful thank you !
nice way to quick save configurations.. thanks you!
The last snippet is really helpful. Thank you!