PowerShell:Import-CSV没有标题并删除部分重复行

时间:2013-12-11 17:36:04

标签: powershell csv

我有一个日志文件格式为CSV,没有标题。第一列基本上是记录问题的唯一标识符。对于相同的问题标识符,可能存在具有不同细节的多个行​​。我想删除第一列重复的行,因为我此时不需要其他数据。

此时我对PowerShell有相当基本的了解,所以我确信有一些简单的我不知道。

如果这是重复的话,我很抱歉,但我可以找到问题来回答问题的某些部分,但不是整个问题。

到目前为止,我最好的猜测是:

Import-Csv $outFile | % { Select-Object -Index 1 -Unique } | Out-File $outFile -Append

但这给了我错误:

  

Import-Csv:成员“LB”已经存在。   在C:\ Users \ jnurczyk \ Desktop \ Scratch \ POImport \ getPOImport.ps1:6 char:1   + Import-Csv $ outFile | %{Select-Object -InputObject $ _ -Index 1 -Unique} |出......   + ~~~~~~~~~~~~~~~~~~~       + CategoryInfo:NotSpecified:(:) [Import-Csv],ExtendedTypeSystemException       + FullyQualifiedErrorId:AlreadyPresentPSMemberInfoInternalCollectionAdd,Microsoft.PowerShell.Commands.ImportCsvCommand

3 个答案:

答案 0 :(得分:10)

由于您的数据没有标头,因此您需要在Import-Csv cmdlet中指定标头。然后,要使用第一列仅选择唯一记录,您需要在Select-Object cmdlet中指定该记录。请参阅以下代码:

Import-Csv $outFile -Header A,B,C | Select-Object -Unique A

为了澄清,我的示例中的标题是A,B和C.如果您知道有多少列,则此方法有效。如果标题太少,则删除列。如果你有太多标题,那么它们就会变成空字段。

答案 1 :(得分:0)

每当我寻找这个问题的解决方案时,我都遇到了这个问题。但是,这里接受的解决方案比我想要的更通用。下面的函数每次看到相同的标题名称时递增:A,B,C,A1 D,A2,C1等。

Function Import-CSVCustom ($csvTemp) {
    $StreamReader = New-Object System.IO.StreamReader -Arg $csvTemp
    [array]$Headers = $StreamReader.ReadLine() -Split "," | % { "$_".Trim() } | ? { $_ }
    $StreamReader.Close()

    $a=@{}; $Headers = $headers|%{
        if($a.$_.count) {"$_$($a.$_.count)"} else {$_}
        $a.$_ += @($_)
    }

    Import-Csv $csvTemp -Header $Headers
}

答案 2 :(得分:0)

要扩展Benjamin Hubbard's post,这里有一个小Sql脚本(假设您将这些数据插入到数据库中的表当然!)我用来创建我的头属性脚本:

SELECT
        '-Header '
            + STUFF((SELECT
                    ',' + QUOTENAME(COLUMN_NAME, '"')
                    + CASE WHEN C.ORDINAL_POSITION % 5 = 0 THEN ' `' + CHAR(13) + CHAR(10) ELSE '' END
                FROM 
                    INFORMATION_SCHEMA.COLUMNS C
                WHERE
                    TABLE_NAME = '<Staging Table Name>'
            FOR XML PATH (''), type).value('.', 'nvarchar(max)'), 1, 1, '')