Обновите столбец CSV с помощью Powershell - PullRequest
0 голосов
/ 17 января 2019

У меня есть 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

с помощью приведенного ниже кода я не могу обновить столбец 'LaptopDesktop' в CSV1, в то время как вывод добавляется с параметром -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 голосов
/ 17 января 2019

Я думаю, тот факт, что вы только что открыли файл для импорта, а затем попытаетесь экспортировать его снова, сбивает с толку 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
0 голосов
/ 17 января 2019

При публикации образцов данных в формате csv либо используйте формат с разделителями-запятыми -or-
столбчатое представление после 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...