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