我正在尝试用CSV编写一些新数据,并且能够完成我需要的工作,但不像我希望的那样优雅,并且想知道是否有人在这里有任何关于清理我的代码的建议。 / p>
目标是在标题“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
部分放在自己的脚本中,先运行它,然后在第二个脚本中运行其余部分,它们都运行完美,但显然效率不高。
除此之外,我猜我也在忽略了一种将我想要的数据写入列的方法,同时我正在创建列但我无法弄清楚如何。
答案 0 :(得分:2)
根据错误消息,CSV首次导入时已经有一列DivisionCode
。将-Exclude DivisionCode
添加到Select-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