使用Powershell更新CSV列

时间:2019-01-17 13:18:09

标签: powershell

我有CSV1(如下所示),我必须在下面填充CSV 2中的最后一列。

CSV1

Computer Product       Code   Country Department LaptopDesktop
-------- -------       ----   ------- ---------- -------------
Com1     EliteDesk 705 HP2190 AU      FN 
Com2     EliteBook 830 HP1023 AU      IT
Com3     EliteBook 830 HP1023 FR      FN
Com4     Zbook 15U     HP2020 IN      FN
Com5     OptiPlex 3010 DL1721 FR      FN

CSV2

Product        Type Code
-------        ---- ----
EliteBook 1030 L    HP1020
EliteBook 1040 L    HP1021
EliteBook 830  L    HP1023
Zbook 15U      L    HP2020
EliteDesk 800  D    HP3035
EliteDesk 705  D    HP2190
Thinkpad L480  L    LE990
OptiPlex 3010  D    DL1721

使用下面的代码,我无法更新CSV1中的“ LaptopDesktop”列,而输出会附加-Append参数,否则将覆盖整个CSV...。如何解决此问题? >

{
$SystemData =@()
$Productinfo = Import-Csv "C:\CSV2.csv"
$Mastercsv = Import-Csv "C:\CSV1.csv"

foreach($record in $Mastercsv)
{
 $mcode = $($record.code)
 $mDLtype = $($record.LaptopDesktop)

 $SysType = ($Productinfo | where {$_.code -eq $mcode}).type
  if ($SysType -eq $null)
  {
    $sysType = 'Unknown, due to non-matching code'
   }

   $AddsysType=New-Object PSCustomObject
     Add-Member -InputObject $AddsysType -membertype noteproperty -name "LaptopDesktop" -value $sysType
   $SystemData +=$AddsysType

 }Return, $SystemData
 }
 $DeviceType= Update-SystemType 
 $DeviceType| Export-Csv 'C:\CSV1.csv' -Force -NoTypeInformation

2 个答案:

答案 0 :(得分:1)

发布csv示例数据时,请使用逗号分隔的格式-或-
Import-Csv之后的柱状表示形式。

## Q:\TEst\2019\01\17\SO_54236818.ps1
$Mastercsv   = Import-Csv ".\CSV1.csv"
$Productinfo = Import-Csv ".\CSV2.csv"

foreach($record in $Mastercsv){
    $record.LaptopDesktop = ($Productinfo|Where-Object Code -eq $record.code).Type
}
$Mastercsv | Format-Table -Auto

样本输出

Computer Product       Code   Country Department LaptopDesktop
-------- -------       ----   ------- ---------- -------------
Com1     EliteDesk 705 HP2190 AU      FN         D
Com2     EliteBook 830 HP1023 AU      IT         L
Com3     EliteBook 830 HP1023 FR      FN         L
Com4     Zbook 15U     HP2020 IN      FN         L
Com5     OptiPlex 3010 DL1721 FR      FN         D
Com6     unknown       na     DE      IT

答案 1 :(得分:0)

我认为您刚刚打开了要导入的文件,然后尝试再次将其导出的事实使PowerShell感到困惑。无论如何,以这种方式覆盖文件可能不是一个好主意,因为它可能导致损坏。这样写一个单独的CSV可能更好:

function Update-SystemType {    
    Import-Csv ".\CSV2.csv" | ForEach-Object {$codeHash = @{}}{
        $codeHash[$_.Code] = $_
    }{}

    Import-Csv ".\CSV1.csv" |
        ForEach-Object {
            $_.LaptopDesktop = $(if($codeHash.ContainsKey($_.Code)){$codeHash[$_.Code].Type}else{"Unknown"})

            $_
        }
}

Update-SystemType |
    Export-Csv '.\CSV3.csv' -Force -NoTypeInformation

如果您真的想在之后替换原始文件,则可以这样覆盖它:

Move-Item -Path .\CSV3.csv -Destination .\CSV1.csv -Force