Экспорт данных в порядке их добавления - 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[]]
массив после первого +=
операция.