Как вы управляете положением имени столбца при создании массивов экспортируемых объектов CSV?

ЭТАЛОННЫЕ СКРИПТЫ:

Скрипт 1:

$csvList = @()

$csvList += New-Object PSObject -Property @{name="test1";accountname="testuser1";mail="[email protected]"}
$csvList += New-Object PSObject -Property @{name="test2";accountname="testuser2";mail="[email protected]"}
$csvList += New-Object PSObject -Property @{name="test3";accountname="testuser3";mail="[email protected]"}
$csvList += New-Object PSObject -Property @{name="test4";accountname="testuser4";mail="[email protected]"}

$csvList | Export-Csv c:\temp\testcsv.csv -NoTypeInformation

Сценарий 2 (добавлен в редактирование, чтобы отразить расширенное использование):

$aTest = @()

for($x=0;$x -le 5;$x++)
{
    $aTest += New-Object PSObject -Property @{Name="test$($x)"; `
                                              AccountName="testuser$($x)"; `
                                              Mail="user$($x)@somewhere.com"}
}

$aTest | Export-Csv c:\temp\testcsv.csv -NoTypeInformation

ВОПРОС:

Хотя этот скрипт создает мой CSV и включает все данные, которые мне нужны, в правильные строки, я не могу понять, как управлять положением столбца. Несмотря на то, что я упорядочиваю и добавляю данные по name,accountname,mail, Powershell упорядочивает их по mail,name,accountname. Как я могу управлять порядком столбцов?

Примечание. Если я делаю дамп содержимого $csvList перед экспортом, порядок уже был изменен.


person Colyn1337    schedule 04.09.2014    source источник


Ответы (2)


Каждый PSObject по сути представляет собой хеш-таблицу. В хеш-таблице нет порядка значений. Select-Object может переформатировать заказ для вас. Сделайте последнюю строчку:

 $csvList | Select-Object name,accountname,mail | Export-Csv c:\temp\testcsv2.csv -NoTypeInformation

Получил идею из этого вопроса на форуме: -столбцы-не-упорядочены-в-правильном-порядке?forum=winserverpowershell" rel="nofollow">Источник

person Ross Presser    schedule 04.09.2014
comment
Сработало отлично, большое спасибо за включение вашего источника;) Как только истечет таймер «отметить как ответ», я приму ваш ответ как ответ. Оглядываясь назад, я не знаю, почему select не пришел мне в голову. - person Colyn1337; 04.09.2014
comment
На самом деле, если бы он сделал [Ordered]@{'Name'='value';'NextName'='OtherValue'}, он упорядочил бы значения хэш-таблицы. - person TheMadTechnician; 04.09.2014

Если вы используете V4, они добавили ускоритель типов ([PSCustomObject]) для создания объектов PS, использующих упорядоченную хеш-таблицу, поэтому свойства остаются в том порядке, в котором они были объявлены в хеш-литерале.

$(
[PSCustomObject]@{name="test1";accountname="testuser1";mail="[email protected]"}
[PSCustomObject]@{name="test2";accountname="testuser2";mail="[email protected]"}
[PSCustomObject]@{name="test3";accountname="testuser3";mail="[email protected]"}
[PSCustomObject]@{name="test4";accountname="testuser4";mail="[email protected]"}
) | Export-Csv c:\temp\testcsv.csv -NoTypeInformation

Изменить: пример использования цикла для создания упорядоченной хеш-таблицы:

foreach ($i in 1..4)
 {
   $ht = [ordered]@{}
   $ht.name = "test$i"
   $ht.accountname = "testuser$i"
   $ht.mail = "[email protected]"
   [PSCustomObject] $ht
 }
person mjolinor    schedule 04.09.2014
comment
+1 за правильный ответ на мой вопрос. Я хотел бы только указать, что эта опция не работает в скрипте, где данные объекта добавляются циклами foreach/for. - person Colyn1337; 04.09.2014
comment
Если вы создаете хеш-таблицу, добавляя записи в цикле, есть ускоритель типа ([ordered]), чтобы начать с упорядоченной хэш-таблицы, например, $ht=[ordered]@{}. Ключи останутся в том порядке, в котором они были добавлены в хэш-таблицу, и объект PS, созданный из этой хеш-таблицы, будет иметь свои свойства в этом порядке. - person mjolinor; 04.09.2014
comment
Я очень ценю, что вы нашли время, чтобы добавить решение цикла. Я попытался адаптировать ваше предложение и, похоже, не могу правильно получить данные или получаю сообщение об ошибке, что хеш-таблицу можно добавить только в другую хеш-таблицу. Я полностью понимаю, что это, вероятно, ошибка пользователя, связанная с отсутствием опыта с моей стороны, но если бы вы могли обновить свой ответ небольшим примером, я бы хотел извлечь из него уроки. - person Colyn1337; 04.09.2014
comment
ХОРОШО. Добавлен пример (надеюсь, это то, что вам нужно. Примечание: упорядоченную хеш-таблицу также можно использовать с New-Object, если вы предпочитаете использовать ее, а не ускоритель типа [PSCustomObject]. - person mjolinor; 04.09.2014