2016-08-11 55 views
1

我仍然試圖將包含某些數據的CSV文件(用逗號分隔)中的重複項從動態排序並刪除到新的CSV文件中。得到了-Property $ SortByColNames的堆棧溢出成員的幫助,但現在我的問題在ForEach部分。如果我在大括號內使用ForEach的編號部分和「-f」後面的列名進行硬編碼,但如果我嘗試將這兩個參數傳遞給函數中的參數,它會給我一個包含物理參數的CSV文件-f部分的字符串。使用PowerShell中的排序對象進行排序第2部分

我試圖讓$ ShowColsByNumber一個字符串和一個對象變量和$ ColumnValueFormat也作爲一個字符串和一個對象。既沒有工作。

任何人都可以請幫忙。

下面是工作的代碼,是不代碼後:

作品

[string] $Source = 'e:\Temp\DataFromSkywardEdited.csv'; 
[string] $Destination = 'e:\Temp\DataFromSkywardRD.csv'; 
[object] $SortByColNames = 'LastName','FirstName'; 

Get-Content $Source | 
     ConvertFrom-Csv | 
    Sort -Property $SortByColNames -Unique | 
    ForEach {"{0},{1},{2},{3},{4},{5},{6},{7},{8}" -f $_.EmployeeID.Trim(), $_.FirstName.Trim(), $_.LastName.Trim(), $_.Location.Trim(), $_.Department.Trim(), $_.TelephoneNo.Trim(), $_.Email.Trim(), $_.EmpTypeCode.Trim(), $_.EmployeeTypeDescription.Trim()} | 
     Add-Content $Destination 

不工作

[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 -Property $SortByColNames -Unique | 
       ForEach {$ShowColsByNumber -f $ColumnValueFormat} | 
        Add-Content $Destination; 
+0

由於您爲「$ _。EmployeeID.Trim()」插入文字字符串,您的替換將不起作用。這不會被調用並擴展爲添加到您的字符串。 –

回答

4

這應該工作。

[String[]]$ColumnValueFormat = 'EmployeeID', 'FirstName', 'LastName' # Truncated, example. 

Get-Content $Source | 
    ConvertFrom-Csv -Delimiter $Delimiter | 
    Sort-Object -Property $SortByColNames -Unique | 
    Select-Object $ColumnValueFormat | 
    ForEach-Object { 
     $_.PSObject.Properties.Value.Trim() -join ',' 
    } 

使用原始值需要類似這樣的東西。每次循環時,必須執行數組中的每個值。其中一種方法使用Invoke-Expression,這並不是一個好的做法。

[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 
+0

嗨克里斯。 謝謝你回到我身邊。我仍然有點困惑。我在下面的行中替換了$ ColumnValueFormat: 與以下內容: 選擇對象和它的大括號中的ForEach對象 但它抱怨$ ShowColsByNumber。 我該如何去做? –

+0

在這個例子中Sort-Object已經爲你排序了值,ForEach-Object中的部分正在處理trim。你不能使用你有的版本,因爲它沒有一些相當混亂的工作,把'$ ColumnValueFormat'中的每個值都變成了一個ScriptBlock。我來給你展示。 –

+0

對不起,我的意思是選擇對象是排序值(排序列,而不是排序行)。無論如何,我已經添加了一種讓原作按原樣工作的可能方式。我不會考慮使用Invoke-Expression作爲一種好的做法,更不得已而爲之。 –

相關問題