web-dev-qa-db-ja.com

PowerShell:ヘッダーのないCSVをインポートし、部分的な重複行を削除します

ヘッダーのないCSVとしてフォーマットされたログファイルがあります。最初の列は基本的に、記録されている問題の一意の識別子です。同じ問題IDに対して、詳細が異なる複数の行が存在する場合があります。現時点では他のデータは必要ないため、最初の列が重複している行を削除したいと思います。

私はこの時点で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} | Out ... + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified :( :) [Import-Csv]、ExtendedTypeSystemException + FullyQualifiedErrorId:AlreadyPresentPSMemberInfoInternalCollectionAdd、Microsoft.PowerShell.Commands。 ImportCsvCommand

6
Joshua Nurczyk

データにはヘッダーがないため、Import-Csvコマンドレットでヘッダーを指定する必要があります。次に、最初の列を使用して一意のレコードのみを選択するには、Select-Objectコマンドレットでそれを指定する必要があります。以下のコードを参照してください。

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

明確にするために、私の例のヘッダーはA、B、およびCです。これは、列の数がわかっている場合に機能します。ヘッダーが少なすぎると、列が削除されます。ヘッダーが多すぎると、それらは空のフィールドになります。

13

この問題の解決策を探すたびに、このスレッドに出くわします。ただし、ここで受け入れられるソリューションは、私が望むより一般的なものです。以下の関数は、同じヘッダー名(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
}
1
user3818571

展開するために 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, '')
0
Mark Kram