按添加顺序导出数据 - 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 将在第一个 +=操作。