2016-08-11 9 views
0

下のパート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

素晴らしいです。技術者ありがとうございました。これは私が探していたものです。私は後で仕事に就くときに試してみると、それがどのように行ったかを教えてくれるでしょう。 –

+0

正常に動作しました。技術者ありがとうございました。私はそれをより動的にする別の問題があります。私は別の質問を掲載しました。あなたや他の誰かが援助できるようになることを願っています。再度、感謝します。 :-) –

2

にはどうすれば$ColumnValueFormatではなく、列名の数字で表現されるようになるだろうか?

あなたはそうではありません。ちょうど…いいえ。あなたが値を区別するためにswitchステートメントを使用したい異なる方法で異なるフィールドを処理しなければならないとしたら

$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 

:CSVのフィールドあなたは、単にthisような何かをしたいをトリミングする

$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 
PowerShellのV3で

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

以降あなたもこのように、特定の順序で作成された特性を有することtype accelerator[ordered]を使用することができます:

またはNew-Object経由でレコードを再作成し

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

かこのように:

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

Ansgar Wiechersありがとうございました。私は将来それを使用します。このソリューションでは、すでにGet-ContentをSort-Objectにパイプして使用しています。 Import CSVを使用した場合、かなりのコードを変更する必要があります。 –

関連する問題