Как добавить заголовок в файл CSV изначально с помощью PowerShell - PullRequest
1 голос
/ 31 октября 2019

Сначала я хочу добавить заголовки в файл CSV. Причина, по которой я хочу добавить заголовки, заключается в том, что для некоторых строк некоторые значения столбцов могут быть пустыми.

Согласно документации Microsoft, export-csv принимает только заголовки / столбцы, которые присутствуют в первой строке.

Когда вы отправляете несколько объектов в Export-CSV, Export-CSV организует файл> на основе свойств первого отправленного вами объекта. Если оставшиеся> объекты не имеют одно из указанных свойств, значение свойства> этого объекта равно нулю, как представлено двумя последовательными запятыми. Если> оставшиеся объекты имеют дополнительные свойства, эти значения свойств> не включаются в файл.

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv?view=powershell-6#notes

Что я пробовал до сих пор:

$csvContents =@()

foreach ($item in $items) {
$row = New-Object System.Object # Create an object to append to the array
$row | Add-Member -MemberType NoteProperty -Name "header1" -Value "value1"
$row | Add-Member -MemberType NoteProperty -Name "header2" -Value "value2"
$row | Add-Member -MemberType NoteProperty -Name "header3" -Value "value3"
$csvContents += $row # append the new data to the array
}

$csvContents | Export-CSV -NoTypeInformation -Path $ResultCsvPath

Проблема в том, что Item1 может иметь только header1 и header3, что означает, что эти столбцы являются динамическими. Таким образом, после экспорта результат csv будет содержать только header1 и header3, а header2 будет отсутствовать.

Я ожидаю, что сначала я хочу добавить header1, header2, header3.

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

В зависимости от того, насколько сложным вы хотите пройти, я делал что-то похожее в прошлом (я тоже изменил его, чтобы использовать [pscustomobject]):

$csvcontents = $items | foreach-object {
    If (-not $_.Header1) { $value1 = '' } Else { $value1 = $_.Value1 }
    If (-not $_.Header2) { $value2 = '' } Else { $value1 = $_.Value2 }
    If (-not $_.Header3) { $value3 = '' } Else { $value1 = $_.Value3 }
    [pscustomobject]@{header1 = $_.value1;header2=$value2;$header3=$value3}
}   

Отказ от ответственности, не проверял выше, но это дает вам суть идеи.

0 голосов
/ 01 ноября 2019

Для больших коллекций это может занять некоторое время, но вот что может подойти вам:

Предположим, это ваша коллекция

$obj = @(
    [pscustomobject]@{
        'header1' = 'value1'
        'header3' = 'value3'
    },
    [pscustomobject]@{
        'header1' = 'value1'
        'header2' = 'value2'
    },
    [pscustomobject]@{
        'header3' = 'value3'
    },
    [pscustomobject]@{
        'header1' = 'value1'
        'header2' = 'value2'
        'header3' = 'value3'
    }
)

Затем вы можете добавить недостающие свойства, например:

# Try and find all headers by looping over all items.
# You could change this to loop up to a maximum number of items if you like.
# The headers will be captured in the order in which they are found. 
$headers = $obj | ForEach-Object {($_.PSObject.Properties).Name} | Select-Object -Unique

# Find the missing headers in the first item of the collection
# and add those with value $null to it.
$headers | Where-Object { ($obj[0].PSObject.Properties).Name -notcontains $_ } | ForEach-Object {
    $obj[0] | Add-Member -MemberType NoteProperty -Name $_ -Value $null
}

# output on console
$obj

# output to csv file
$obj | Export-Csv -Path 'D:\test.csv' -NoTypeInformation

Вывод:

header1 header3 header2
------- ------- -------
value1  value3         
value1          value2 
        value3         
value1  value3  value2
0 голосов
/ 31 октября 2019

Убедитесь, что для столбца в строке, в которой используется значение $null, отсутствуют данные. Я только что проверил это и получил ожидаемый результат.

$row = New-Object System.Object # Create an object to append to the array
$row | Add-Member -MemberType NoteProperty -Name "header1" -Value "value1"
$row | Add-Member -MemberType NoteProperty -Name "header2" -Value $null
$row | Add-Member -MemberType NoteProperty -Name "header3" -Value "value3"
$row | Export-Csv -NoTypeInformation test.csv

Выход (из CSV)

"header1","header2","header3"
"value1",,"value3"
...