Экспорт данных в порядке их добавления - 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

Как получить экспорт в том порядке, в котором он был добавлен?

2 ответа

Решение

Даже без использования вашей функции, простой

$mydata = $data | select Name,Grade,Score

даст желаемый результат.

Ваша функция IMO слишком сложна:

$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

Возвращает здесь тот же порядок:

Name      Grade Score
----      ----- -----
Anthoni   A     10
Brandon   B     20
Christian C     30
David     D     40

Полезный ответ LotPings предоставляет эффективные решения.

Что касается того, что вы пытались:

Строя только один [pscustomobject] Экземпляр вне цикла:

$DLGP = "" | Select "Name","Grade","Score"

а затем обновлять только свойства этого экземпляра в каждой итерации цикла:

$DLGP.Name=$record.name
# ....

вы фактически добавили то же самое [pscustomobject] Экземпляр несколько раз в массив результатов вместо создания отдельного объекта в каждой итерации.

Так как один и тот же объект неоднократно обновлялся, этот объект в конечном итоге имел свойства последнего объекта во входной коллекции, $data,

Как в сторону:

[PSCustomObject] @() фактически так же, как @(): [PSCustomObject] игнорируется, и вы получите [object[]] массив.

Чтобы ввести массив как содержащий [PSCustomObject] экземпляры, вы должны будете использовать приведение типа массива: [PSCustomObject[]] @(),

Однако, учитывая, что экземпляры любого типа могут быть приведены к [PSCustomObject] - что действительно так же, как [psobject] - это не дает никакой безопасности типа и никакой выгоды в производительности.

Кроме того, так как ваш $rec переменная не ограничена по типу (она определяется как $rec = [<type>] ... скорее, чем [<type>] $rec = ...) и вы используете += "добавить" в массив (который неизменно требует создания нового экземпляра за кулисами), $rec вернется к [object[]] массив после первого += операция.

Другие вопросы по тегам