3

PS スクリプトを使用して、ある部門のシステムからのエクスポートを別の部門のシステムにインポートできるプロセスの一部を自動化しようとしています。複数の「;」で行を取得する必要があります 電子メールアドレスを分離し、残りのデータを保持しながら、それぞれ 1 つのアドレスで別々の行に分割します。Import-CSVに依存する、ほとんど機能しているこれに対する解決策があります。

私が抱えている問題は、取得しているエクスポートに同じ列ヘッダーを持つ複数の行があることです。これにより、Powershell で「The Member "end" is already present.」というエラーが表示されます。(ここで、「終了」は複数の列のヘッダーです)。

これは、列ヘッダーが重複しているときに「import-csv ./addresses.csv」を実行するだけで発生するため、スクリプトで行っている可能性のある奇妙なこととは対照的に、import-csv コマンド自体に違反していると思います。

csv を編集して列名の 1 つを変更すると、これは修正されますが、その要件により、プロセスの自動化が難しくなります。

列名が重複するCSVをPowerShellで操作する方法はありますか? 電子メール アドレスを含む列名以外の列名を指定するのは避けたいと思います。列名は定期的に変更されるようです。彼らが使用している列名を保持できれば最高です。

4

2 に答える 2

4

これが古い投稿であることは知っていますが、他の誰かが「より良い解決策」を探しているかもしれないと考えました。

重複しているヘッダーを動的に修正する必要がありました。また、インポートしようとしているファイルのフィールドを事前に知らなかったため、いくつかの重大な課題が発生しました。

これが私がしたことです:

# Use System.IO.StreamReader to get the first line. Much faster than Get-Content.
$StreamReader = New-Object System.IO.StreamReader -Arg $csvTemp

# Parse the first line with whatever delimiter you expect. Trim + Remove Empty columns.
# Comment out the last part if you want to generate headers for those who are empty.
[array]$Headers = $StreamReader.ReadLine() -Split "," | % { "$_".Trim() } | ? { $_ }

# Close the StreamReader, as the file will stay locked.
$StreamReader.Close()

# For each Header column
For ($i=0; $i -lt $Headers.Count; $i++) {

    if ($i -eq 0) { Continue } #Skip first column.

    # If in any previous column, give it a generic header name
    if ($Headers[0..($i-1)] -contains $Headers[$i]) {
        $Headers[$i] = "Header$i"
    }
}

# Import CSV with the new headers 
Import-Csv $csvTemp -Header $Headers
于 2016-02-22T19:21:19.753 に答える
1

列データが事前にわかっている場合は、独自のヘッダー名を指定するだけで、ファイルのヘッダー行が無視されます。

Import-CSV -Header header1, header2, header3 addresses.csv
于 2013-09-17T22:47:39.080 に答える