2013-12-11 190 views
4

我有一個日誌文件,格式爲CSV,沒有標題。第一列基本上是正在記錄的問題的唯一標識符。對於相同的問題標識符,可能會有多行具有不同的詳細信息。我想刪除第一列重複的行,因爲此時我不需要其他數據。PowerShell:導入CSV沒有標題並刪除部分重複行

在這一點上,我對PowerShell有相當的基本知識,所以我確信有一些簡單的我錯過了。

對不起,如果這是重複的,但我可以找到問題來回答問題的某些部分,但不是整個問題。

到目前爲止,我最好的猜測是:

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

但是,這給我的錯誤:

Import-Csv : The member "LB" is already present. At C:\Users\jnurczyk\Desktop\Scratch\POImport\getPOImport.ps1:6 char:1 + Import-Csv $outFile | % { Select-Object -InputObject $_ -Index 1 -Unique } | Out ... + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Import-Csv], ExtendedTypeSystemException + FullyQualifiedErrorId : AlreadyPresentPSMemberInfoInternalCollectionAdd,Microsoft.PowerShell.Commands.ImportCsvCommand

+0

發佈您擁有的內容。 – mjolinor

+0

使用foreach循環意味着您要從一行中選擇每一行。嘗試刪除%{}。 –

回答

10

因爲你的數據沒有標題,你需要在你Import-Csv cmdlet來指定頭。然後,要使用第一列僅選擇唯一記錄,則需要在Select-Object cmdlet中指定該記錄。請參見下面的代碼:

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

爲了澄清,我的例子中,標題是A,B和C.這工作,如果你知道有多少列有。如果標題太多或太少,它們將被忽略或只是沒有標題。

+0

我嘗試了類似的東西,但無法弄清楚標題名稱的位置(在你的例子中是A)。我唯一的問題是,當我輸出到一個文件時,它會在每行的末尾添加一堆空格。雖然煩人,我不介意這麼多。 –

+0

嘗試使用'trim()'去除空格。 –

+0

trim()不適用於非字符串對象。可能想出如何使它將Select-Object的輸出解釋爲一個字符串。 –

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() 

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

    Import-Csv $csvTemp -Header $Headers 
} 
+0

只要提到'System.IO.StreamReader'需要。淨。 – plaes

+0

這個解決方案只是一個頭,不符合RFC-4180。如果標題轉義且包含逗號,它將會中斷。 tools.ietf.org/html/rfc4180 –

0

要在Benjamin Hubbard'spost這裏擴大被稍微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, '')