按添加顺序导出数据 - PowerShell Export-Csv
Export data in the order it was added - PowerShell Export-Csv
我有这个代码
function get-data()
{
$rec=[PSCustomObject]@()
$DLGP = "" | Select "Name","Grade","Score"
foreach($record in $data)
{
$DLGP.Name=$record.name
$DLGP.Grade=$record.grade
$DLGP.Score=$record.score
$rec += $DLGP
}
return $rec
}
$mydata=get-data
$mydata | Export-Csv -Path $outputPath -NoTypeInformation
问题是,数据没有按照我添加到 $rec
的顺序导出
如何按添加的顺序导出它?
甚至不用你的函数,一个简单的
$mydata = $data | select Name,Grade,Score
会产生预期的结果。
你的函数在我看来太复杂了:
$Data = @"
Name,Grade,Score,Dummy
Anthoni,A,10,v
Brandon,B,20,x
Christian,C,30,y
David,D,40,z
"@ | ConvertFrom-Csv
function get-data() {
ForEach($record in $data) {
[PSCustomObject]@{
Name =$record.name
Grade=$record.grade
Score=$record.score
}
}
}
$mydata=get-data
$mydata # | Export-Csv -Path $outputPath -NoTypeInformation
Returns 这里的顺序完全相同:
Name Grade Score
---- ----- -----
Anthoni A 10
Brandon B 20
Christian C 30
David D 40
提供了有效的解决方案。
至于你试过的:
通过仅构造一个单个 [pscustomobject]
实例在循环外:
$DLGP = "" | Select "Name","Grade","Score"
然后在每次循环迭代中仅更新该实例的属性:
$DLGP.Name=$record.name
# ....
您 有效地将完全相同的 [pscustomobject]
实例多次添加到结果数组,而不是在每次迭代中创建不同的对象。
由于同一对象被重复更新,该对象最终具有输入集合中 last 对象的属性,$data
.
顺便说一句:
[PSCustomObject] @()
实际上与 @()
相同:[PSCustomObject]
被 忽略 并且您得到一个 [object[]]
数组。
要将数组键入为包含 [PSCustomObject]
个实例的数组,您必须使用 array 类型的转换:[PSCustomObject[]] @()
.
但是,鉴于 any 类型的实例可以转换为 [PSCustomObject]
- 这实际上与 [psobject]
相同 - 这不提供类型安全并且没有性能优势。
此外,由于您的 $rec
变量不受类型限制(它被定义为 $rec = [<type>] ...
而不是 [<type>] $rec = ...
)并且您正在使用 +=
"add to" 数组(总是需要在幕后创建 新实例 ),$rec
将在第一个 +=
操作。
我有这个代码
function get-data()
{
$rec=[PSCustomObject]@()
$DLGP = "" | Select "Name","Grade","Score"
foreach($record in $data)
{
$DLGP.Name=$record.name
$DLGP.Grade=$record.grade
$DLGP.Score=$record.score
$rec += $DLGP
}
return $rec
}
$mydata=get-data
$mydata | Export-Csv -Path $outputPath -NoTypeInformation
问题是,数据没有按照我添加到 $rec
的顺序导出如何按添加的顺序导出它?
甚至不用你的函数,一个简单的
$mydata = $data | select Name,Grade,Score
会产生预期的结果。
你的函数在我看来太复杂了:
$Data = @"
Name,Grade,Score,Dummy
Anthoni,A,10,v
Brandon,B,20,x
Christian,C,30,y
David,D,40,z
"@ | ConvertFrom-Csv
function get-data() {
ForEach($record in $data) {
[PSCustomObject]@{
Name =$record.name
Grade=$record.grade
Score=$record.score
}
}
}
$mydata=get-data
$mydata # | Export-Csv -Path $outputPath -NoTypeInformation
Returns 这里的顺序完全相同:
Name Grade Score
---- ----- -----
Anthoni A 10
Brandon B 20
Christian C 30
David D 40
至于你试过的:
通过仅构造一个单个 [pscustomobject]
实例在循环外:
$DLGP = "" | Select "Name","Grade","Score"
然后在每次循环迭代中仅更新该实例的属性:
$DLGP.Name=$record.name
# ....
您 有效地将完全相同的 [pscustomobject]
实例多次添加到结果数组,而不是在每次迭代中创建不同的对象。
由于同一对象被重复更新,该对象最终具有输入集合中 last 对象的属性,$data
.
顺便说一句:
[PSCustomObject] @()
实际上与 @()
相同:[PSCustomObject]
被 忽略 并且您得到一个 [object[]]
数组。
要将数组键入为包含 [PSCustomObject]
个实例的数组,您必须使用 array 类型的转换:[PSCustomObject[]] @()
.
但是,鉴于 any 类型的实例可以转换为 [PSCustomObject]
- 这实际上与 [psobject]
相同 - 这不提供类型安全并且没有性能优势。
此外,由于您的 $rec
变量不受类型限制(它被定义为 $rec = [<type>] ...
而不是 [<type>] $rec = ...
)并且您正在使用 +=
"add to" 数组(总是需要在幕后创建 新实例 ),$rec
将在第一个 +=
操作。