如何使用 PowerShell 最初将 header 添加到 CSV 文件
How to add header to a CSV file initially with PowerShell
我想先将 headers 添加到 CSV 文件。我最初要添加 headers 的原因是对于某些行,某些列值可能为空。
根据 Microsoft 文档,export-csv 仅采用第一行中的 headers/columns。
When you submit multiple objects to Export-CSV, Export-CSV organizes the file >based on the properties of the first object that you submit. If the remaining >objects do not have one of the specified properties, the property value of >that object is null, as represented by two consecutive commas. If the >remaining objects have additional properties, those property values are not >included in the file.
到目前为止我尝试过的:
$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。
确保您使用 $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"
根据你想要的复杂程度,我过去做过类似的事情(我也改变了它以使用 [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}
}
免责声明,上面没有测试,但它给了你这个想法的要点。
如果 collection 较大,这可能需要一些时间,但以下内容可能对您有用:
假设这是你的 collection
$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
请在此处找到基于生成的目录输出创建 CSV 的示例:
$basedir = "E:220205MassUpload1"
$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。
我想先将 headers 添加到 CSV 文件。我最初要添加 headers 的原因是对于某些行,某些列值可能为空。
根据 Microsoft 文档,export-csv 仅采用第一行中的 headers/columns。
When you submit multiple objects to Export-CSV, Export-CSV organizes the file >based on the properties of the first object that you submit. If the remaining >objects do not have one of the specified properties, the property value of >that object is null, as represented by two consecutive commas. If the >remaining objects have additional properties, those property values are not >included in the file.
到目前为止我尝试过的:
$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。
确保您使用 $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"
根据你想要的复杂程度,我过去做过类似的事情(我也改变了它以使用 [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}
}
免责声明,上面没有测试,但它给了你这个想法的要点。
如果 collection 较大,这可能需要一些时间,但以下内容可能对您有用:
假设这是你的 collection
$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
请在此处找到基于生成的目录输出创建 CSV 的示例:
$basedir = "E:220205MassUpload1"
$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。