我有一个日志文件格式为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
答案 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, '')