2016-03-29 14 views
1

私はCSVに新しいデータを書き込もうとしていますが、私が望んでいたのと同じくらいうまくいくわけではありません。私のコードをアップ。新しい列をCSVに書き込む

"Code"ヘッダーの下に6桁の長い番号のリストを含むCSVを取得し、 "DivisionCode"という新しい列を作成し、 "Code"フィールドの最初の2桁のみを割り当てますその新しい列。ここで

は、私が現在持っているものです。

$Importcsv = import-csv C:\test.csv 

# This takes the named CSV and adds the column "DivisionCode" to the end then 
# writes back to the same CSV 
$Importcsv | Select-Object *,@{Name='DivisionCode';Expression={''}} | 
    Export-Csv C:\test.csv -NoTypeInformation 

$Importcsv = import-csv C:\test.csv 

foreach ($Number in $Importcsv) { 
    $Code = $Number.Code 
    $DivisionCode = $Code -replace ".{4}$" 
    if ($Number.DivisionCode -like "") { 
    $Number.DivisionCode = $DivisionCode 
    } 
} 

$Importcsv | Export-Csv c:\RESONE\test2.csv -NoTypeInformation -Encoding ASCII 

私は、単一のスクリプトとして最終的な結果は、私が欲しいものですが、それはすべての行に対してエラーをスローすることを実行したとき。私は何度も新しい列を作成しようとしています。列の作成がForEachループの外にあるので、私には理解できません。次のようにスローエラーは次のとおりです。

Select-Object : Property cannot be processed because property "DivisionCode" already 
exists. 
At C:\Trim2.ps1:4 char:30 
+ $Importcsv | Select-Object <<<< *,@{Name='DivisionCode';Expression={''}} | Export-Csv C:\test.csv 
    + CategoryInfo   : InvalidOperation: (@{FirstName=Mad... DivisionCode=}:PSObject) [Select-Object], PSArgumentException 
    + FullyQualifiedErrorId : AlreadyExistingUserSpecifiedPropertyNoExpand,Microsoft.PowerShell.Commands.SelectObjectCommand

私が最初にそれを実行し、独自のスクリプトでSelect-Object部分を配置する場合は、2番目のスクリプトで休息を実行し、それはすべてが完璧に実行されますが、明らかにそれはほど効率的ではありませんかもしれない。

それに加えて、私は、私が列を作成すると同時に私が列にしたいデータを書き込む方法を見落としていると推測していますが、私は方法を理解することができませんでした。

答えて

2

エラーメッセージによると、CSVには最初にインポートするときにすでにDivisionCodeの列があります。交換するため-Exclude DivisionCodeSelect-Objectに追加してください。また、繰り返しインポート/エクスポートする必要はありません。

Import-Csv 'C:\test.csv' | 
    Select-Object *,@{n='DivisionCode';e={$_.Code -replace '.{4}$'}} -Exclude DivisionCode | 
    Export-Csv 'C:\RESONE\test2.csv' -NoType -Encoding Ascii 
+0

ええと、エラーを投げたときに新しい列を追加したコードをすでに実行していた可能性はありますが、それは間違いなく説明します。これは、開始する列を持たないcsvの定期的な新しいバージョンで実行されるスクリプトになります。 'e = {$ _。コード - 置き換え '。{4} $'}'は、わからない部分です。どのように動作するかを理解するために 'Select-Object'フォーマットについて勉強しようと思います。 '-Exclude DivisionCode'を理解するのは、すでに存在していれば必要です(私は知っていませんか?) – Zamoz

+0

' -Exclude'はプロパティが存在すればそれを除外し、そうでなければ何もしません。 –

+0

ロジャー。 '-Exclude'部分を省略し、完全に動作しました。私は、エラーの沢山を得たとき、私のテストですでに列を持っていたに違いない。助けてくれてありがとう!これはPowerShellへの私の最初の進出でしたので、私は見落とされていたものがあることを知っていました。 – Zamoz

関連する問題