If an object you export as CSV with Export-Csv
or ConvertTo-Csv
has property values that contain a collection (array) of values, these values are stringified via their .ToString()
method, which results in an unhelpful representation, as in the case of your array-valued .IPV4Addresses
property.
To demonstrate this with the ConvertTo-Csv
cmdlet (which works analogously to Export-Csv
, but returns the CSV data instead of saving it to a file):
PS> [pscustomobject] @{ col1 = 1; col2 = 2, 3 } | ConvertTo-Csv
"col1","col2"
"1","System.Object[]"
That is, the array 2, 3
stored in the .col2
property was unhelpfully stringified as System.Object[]
, which is what you get when you call .ToString()
on a regular PowerShell array; other .NET collection types - such as [System.Collections.Generic.List[string]]
in your case - stringify analogously; that is, by their type name.
Assuming you want to represent all values of an array-valued property in a single CSV column, to fix this problem you must decide on a meaningful string representation for the collection as a whole and implement it using Select-Object
with a calculated property:
E.g., you can use the -join
operator to create a space-separated list of the elements:
PS> [pscustomobject] @{ col1 = 1; col2 = 2, 3 } |
Select-Object col1, @{ n='col2'; e={ $_.col2 -join ' ' } } |
ConvertTo-Csv
"col1","col2"
"1","2 3"
Note how array 2, 3
was turned into string '2 3'
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…