2013-09-25 14 views
11

Jestem nowy w powershell, więc scenariusz to Frankenstein z różnych przykładów z witryn.Czy istnieje sposób na wymuszenie polecenia cmdlet powershell-EXPORT-CSV w celu zachowania określonej kolejności kolumn?

Moje pytanie brzmi: jak mogę się upewnić, że plik csv, który tworzę dla DataTable, zachowuje kolejność kolumn, które określam?

Mój skrypt robi to, aby wypełnić nagłówki CSV i wartości tak:

...snip... 
$dataTable | ForEach-Object { 
      $csv+=New-Object PSObject -Property @{ 
       program_code=$_.ProgramCode; 
       first_name=$_.FirstName; 
       last_name=$_.LastName; 
       email=$_.email; 
       phone=$_.phone; 
       phone2=$_.otherphone; 
       address=$_.addr1; 
       address2=$_.addr2; 
       city=$_.city; 
       state=$_.state; 
       postal_code=$_.Zip; 
       country=$_.Country; 
       grad_year=$_.HsGradDate; 
       lead_date=$_.LeadDate; 
       lead_source=$_.LeadSource; 
       school_status=$_.SchoolStatus; 
     } 
     } 
    $csv | Export-CSV C:\scripts\NewLeads$(Get-Date -Format yyyyMMdd).csv -notype -Append 
...snip... 

Chcę plik musiał kolumnach w kolejności określić w skrypcie, ale kiedy go otworzyć w notatniku lub Excel kolumny pojawiają się w pozornie losowej kolejności. Słowo kluczowe wydaje się pozornie, ponieważ mogą one mieć jakiś sposób zamawiania się.

Odpowiedz

15

W PowerShell V3, zamiast:

 $csv+=New-Object PSObject -Property @{ 

użyłbym:

 $csv+=[pscustomobject]@{ 

PowerShell V3 parser będzie zachować kolejność klawiszy gdy rzucisz hash dosłowny do [zamówić] lub [pscustomobject]. Mała korzyść z tego podejścia - będzie również szybsza.

Jeśli używasz V2, musisz pominąć parametr -Property w New-Object i zamiast tego użyć wielu połączeń do Add-Member. Będzie wyglądać jak:

$csv+=New-Object PSObject | 
    Add-Member -Name program_code -Value $_.ProgramCode -MemberType NoteProperty -PassThru | 
    Add-Member -Name first_name -Value $_.FirstName -MemberType NoteProperty -PassThru | 
    ... 
+0

Dzięki, oba dobre rozwiązania! Twoje wymagało trochę mniej pisania, którego jestem wielkim fanem. – ledgeJumper

+0

Korzystanie z notacji [pscustomobject] @ {} pomogło niezmiernie nad metodą v2, dzięki – flux9998

10

Wybierz pola w wymaganej kolejności, a następnie wyeksportuj.

$csv | select-object -property program_code,first_name,last_name,email,phone,phone2,address,address2,city,state,psotal_code,country,grad_year,lead_date,lead_source,school_status | 
Export-CSV C:\scripts\NewLeads$(Get-Date -Format yyyyMMdd).csv -notype -Append 

Może być jednak możliwe krótkie spięcie. W zależności od tego, czym naprawdę jest $dataTable, możesz (w większości przypadków) móc wybrać bezpośrednio z tego obiektu i ominąć tworzenie kolekcji PSObjects. Ale jeśli potrzebujesz niestandardowych nagłówków, będziesz musiał użyć wyrażeń w select-object (łamigłówki dla czytelności).

$dataTable| select-object @{Name="program_code";Expression={$_.ProgramCode}},` 
@{Name="first_name";Expression={$_.firstname}},` 
@{Name="last_name";Expression={$_.lastname}},email,phone,` 
@{Name="phone2";Expression={$_.otherphone}},` 
@{Name="addr1";Expression={$_.address}},` 
@{Name="addr2";Expression={$_.address2}},city,state,` 
@{Name="postal_code";Expression={$_.zip}},country,` 
@{Name="grad_year";Expression={$_.hsgraddate}},` 
@{Name="lead_date";Expression={$_.leaddate}},` 
@{Name="lead_source";Expression={$_.leadsource}},` 
@{Name="school_status ";Expression={$_.schoolstatus }}| 
Export-CSV C:\scripts\NewLeads$(Get-Date -Format yyyyMMdd).csv -notype -Append 
Powiązane problemy