2016-08-11 56 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作为一种好的做法,更不得已而为之。 –

相关问题