2016-08-11 54 views
0

從以下第2部分的示例稍微改變了我的代碼,但參考了第2部分,它非常感謝stackoverflow中的成員。使用PowerShell中的排序對象進行排序第3部分

[string] $Source = 'e:\Temp\DataFromSkywardEdited.csv'; 
[string] $Destination = 'e:\Temp\DataFromSkywardRD.csv'; 
[object] $SortByColNames = 'LastName','FirstName'; 
[string] $ShowColsByNumber = "{0},{1},{2},{3},{4},{5},{6},{7},{8}"; 
[object] $ColumnValueFormat = '$_.EmployeeID.Trim()', '$_.FirstName.Trim()', '$_.LastName.Trim()', '$_.Location.Trim()', '$_.Department.Trim()', '$_.TelephoneNo.Trim()', '$_.Email.Trim()', '$_.EmpTypeCode.Trim()', '$_.EmployeeTypeDescription.Trim()'; 

Get-Content $Source | 
    ConvertFrom-Csv -Delimiter $Delimiter | 
    Sort-Object -Property $SortByColNames -Unique | 
    ForEach-Object { 
     # Each of the values in $ColumnValueFormat must be executed to get the property from the loop variable ($_). 
     $values = foreach ($value in $ColumnValueFormat) { 
      Invoke-Expression $value 
     } 
     # Then the values can be passed in as an argument for the format operator. 
     $ShowColsByNumber -f $values 
    } | 
    Add-Content $Destination 

我怎麼會做出$ ColumnValueFormat由數字而不是列名來表示?

所以不是:

[object] $ColumnValueFormat = '$_.EmployeeID.Trim()', '$_.FirstName.Trim()', '$_.LastName.Trim()', '$_.Location.Trim()', '$_.Department.Trim()', '$_.TelephoneNo.Trim()', '$_.Email.Trim()', '$_.EmpTypeCode.Trim()', '$_.EmployeeTypeDescription.Trim()'; 

喜歡的東西:

[object] $ColumnValueFormat = '$_.[0].Trim()', '$_.[1].Trim()', '$_.[2].Trim()', '$_.[3].Trim()', '$_.[4].Trim()', '$_.[5].Trim()', '$_.[6].Trim()', '$_.[7].Trim()', '$_.[8].Trim()'; 

回答

2

這真的看起來像你這樣做硬盤的方式,而是直接回答你的問題,你會直接刪除括號內的數字。所以......

[object] $ColumnValueFormat = '$_[0].Trim()', '$_[1].Trim()', '$_[2].Trim()', '$_[3].Trim()', '$_[4].Trim()', '$_[5].Trim()', '$_[6].Trim()', '$_.[7]Trim()', '$_[8].Trim()'; 
+0

太棒了。謝謝TheMadTechnician。這是我一直在尋找的。稍後我開始工作時,我會試一試,並會告訴你它是如何發生的。 –

+0

工作出色。謝謝TheMadTechnician。雖然我有另一個問題使它更動態。我發佈了另一個問題。希望你或其他人能夠提供幫助。再次感謝。 :-) –

2

我怎麼會做出$ColumnValueFormat通過數字而不是列名來表示?

你不會。只是…沒有。

要剪輯CSV領域你會簡單地做這樣的事情this

$csv = Import-Csv $Source 

foreach ($record in $csv) { 
    foreach ($property in $record.PSObject.Properties) { 
    $property.Value = $property.Value.Trim() 
    } 
} 

$csv | Sort-Object $SortByColNames -Unique | Export-Csv $Destination 

如果你不得不在對待不同的方式,你會使用一個switch聲明的值來區分不同的領域:

$property.Value = switch ($property.Name) { 
    'foo' { ... } 
    'bar' { ... } 
    ... 
} 

經由calculated properties修改的字段:

Import-Csv $Source | 
    Select-Object @{n='EmployeeID';e={$_.EmployeeID.Trim()}, 
    @{n='FirstName';e={...}, 
    ... | 
    Sort-Object $SortByColNames -Unique | 
    Export-Csv $Destination 
通過

或重新創建的記錄:

Import-Csv $Source | 
    ForEach-Object { 
    New-Object -Type PSObject -Property @{ 
     'EmployeeID' = $_.EmployeeID.Trim() 
     'FirstName' = ... 
     ... 
    } 
    } | 
    Sort-Object $SortByColNames -Unique | 
    Export-Csv $Destination 

在PowerShell中v3和較新的,你甚至可以使用type accelerator[ordered]有一個特定的順序創建的屬性,如:

$props = [ordered]@{ 
    'EmployeeID' = $_.EmployeeID.Trim() 
    'FirstName' = ... 
    ... 
} 
New-Object -Type PSObject -Property $props 

或像這樣:

[PSObject][ordered]@{ 
    'EmployeeID' = $_.EmployeeID.Trim() 
    'FirstName' = ... 
    ... 
} 
+0

謝謝Ansgar Wiechers對你的時間和知識做出迴應。我將來會使用它。對於這個解決方案,我已經使用輸入到排序對象中的Get-Content。如果我使用導入CSV,我將不得不更改相當多的代碼。 –

相關問題