有没有办法强制PowerShell -Export-CSV cmdlet维护特定的列顺序?

时间:2013-09-25 20:08:09

标签: powershell csv

我是PowerShell的新手,因此该脚本是来自网站的各种示例的Frankenstein。

我的问题是如何确保我为DataTable创建的csv文件保持我指定的列顺序?

我的脚本执行此操作来填充csv标头和值,如下所示:

...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...

我希望文件按照我在脚本中指定的顺序排列,但是当我在记事本或excel中打开它时,列会以看似随机的顺序出现。关键词似乎因为他们可能有一些自我排序的方法。

2 个答案:

答案 0 :(得分:18)

在PowerShell V3中,而不是:

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

我会用:

        $csv+=[pscustomobject]@{

当您将哈希文字强制转换为[ordered]或[pscustomobject]时,PowerShell V3解析器将保留键的顺序。这种方法的一个小方面好处 - 它也会更快。

如果您使用的是V2,则需要将-Property参数跳过到New-Object,而是使用多次调用Add-Member。它看起来像:

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

答案 1 :(得分:10)

按所需顺序选择字段,然后导出。

$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

但是,您可以稍微短路一下。根据{{​​1}}的真实情况,您可以(在大多数情况下)应该直接从该对象中选择并绕过创建$dataTable的集合。但是,如果您需要自定义标头,则需要在PSObjects中使用表达式(换行符以便于阅读)。

select-object