2

我想最初将标题添加到 CSV 文件。我最初要添加标题的原因是某些行,某些列值可能为空。

根据 Microsoft 文档,export-csv 仅采用第一行中存在的标题/列。

当您向 Export-CSV 提交多个对象时,Export-CSV > 根据您提交的第一个对象的属性来组织文件。如果剩余的 >objects 没有指定的属性之一,则 >那个 object 的属性值为 null,由两个连续的逗号表示。如果 >remaining 对象具有其他属性,则这些属性值不会 >包含在文件中。

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。

4

4 回答 4

1

根据您想要的复杂程度,我过去做过类似的事情(我也将其更改为使用 [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}
}   

免责声明,未测试上述内容,但它为您提供了这个想法的要点。

于 2019-10-31T14:43:11.050 回答
1

确保您使用$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"
于 2019-10-31T14:34:05.493 回答
1

对于大型收藏,这可能需要一些时间,但这里有一些可能对您有用:

假设这是你的收藏

$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
于 2019-11-01T10:50:52.580 回答
0

请在此处找到基于生成的目录输出创建 CSV 的示例:

$basedir = "E:\20220205MassUpload1"
$picDir = "$($baseDir)\pics"
$res=ls $picDir
$outputArray = @()
foreach($line in $res) {
    $name = $($line.name).Replace(".png","")
    $outputArray += (
        [pscustomobject]@{
            Title = "$name"
            Brand = 'Brand'
            BulletPoint1='BulletPoint1'
            BulletPoint2='BulletPoint2'
            Description='Description'
            Price='19.95'
            Tags='Tags'
            ImagePath="$($picDir)\$($line.name)"

        });
}

$outputArray | Export-csv -NoTypeInformation "$basedir\upload.csv"

它的作用是获取目录中所有元素的列表。

为每个结果创建一个“pscustomobject”并为列创建值,有些是“固定的”,有些是“计算的”。

最后,数组将通过管道传输到 CSV。

于 2022-02-05T05:25:51.740 回答