将新列写入CSV

时间:2016-03-29 21:00:47

标签: csv powershell

我正在尝试用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部分放在自己的脚本中,先运行它,然后在第二个脚本中运行其余部分,它们都运行完美,但显然效率不高。

除此之外,我猜我也在忽略了一种将我想要的数据写入列的方法,同时我正在创建列但我无法弄清楚如何。

1 个答案:

答案 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