将数据导出并附加到csv文件时出现问题

jecbmhm3  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(152)

情况如下-我有一个包含列数的csv文件(假设3)和自定义对象具有相同的列,但其中一个将是新的。我想比较列名,如果有新的列名,则添加列,然后相应地添加值到csv文件中,我不想替换当前csv文件中的所有现有内容。以下是我编写的代码,但我得到了错误:* 追加的对象没有与以下列对应的属性:column 1。若要继续处理不匹配的属性,请添加-Force参数,然后重试该命令。*
文件示例:

输出应为同一文件,但具有新列“column 4”和包含以下内容的新行,如下所示:

我不知道我做错了什么。

$file_path = '..path_to_the_file\test_csv.csv'
$csv = import-csv -path $file_path

$columns = @([pscustomobject]@{
    column1 = 'something_new_1'
    column2 = 'something_new_2'
    column3 = 'something_new_3'
    column4 = 'something_new_4'
}
)
$csv_columns = ($csv | get-member).where({$_.Membertype -eq 'NoteProperty'}).Name
$columns = ($columns | get-member).where({$_.Membertype -eq 'NoteProperty'}).Name
$compare = $columns | Where-Object {$csv_columns -notContains $_}
foreach ($column in $csv) {
    $column | add-member -MemberType NoteProperty -Name $compare -value ''
}

$csv | export-csv -Path $file_path -NoTypeInformation

$columns | export-csv -path $file_path -Append -NoTypeInformation -force
qhhrdooz

qhhrdooz1#

您可以使用此函数来简化过程,当然,这假定您要 append 的对象已经与对象数组中的对象具有相同的属性,并且只会添加新的对象。

function Add-ObjectNormalized {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [object] $InputObject,

        [Parameter(Mandatory, Position = 0)]
        [object[]] $AddObject
    )

    begin {
        $isFirstObject   = $false
        $propertiesToAdd = [Collections.Generic.HashSet[string]]::new(
            [string[]] $AddObject[0].PSObject.Properties.Name,
            [System.StringComparer]::OrdinalIgnoreCase
        )
    }
    process {
        if(-not $isFirstObject) {
            $isFirstObject = $true
            $propertiesToAdd.ExceptWith([string[]] $InputObject.PSObject.Properties.Name)
        }

        $psobject = $InputObject.PSObject.Properties
        foreach($prop in $propertiesToAdd) {
            $psobject.Add([psnoteproperty]::new($prop, $null))
        }
        $InputObject
    }

    end {
        $AddObject
    }
}

Import-Csv之后用管道将其连接起来,包括要作为参数添加的对象数组。例如:

$objects = @(
    [pscustomobject]@{
        column1 = 'something_new_1'
        column2 = 'something_new_2'
        column3 = 'something_new_3'
        column4 = 'something_new_4'
    }
    [pscustomobject]@{
        column1 = 'something_new_5'
        column2 = 'something_new_6'
        column3 = 'something_new_7'
        column4 = 'something_new_8'
    }
)

Import-Csv path\to\csv.csv | Add-ObjectNormalized $objects |
    Export-Csv path\to\newCsv.csv -NoTypeInformation

使用简单的Csv(如所讨论的Csv)的输出将是:

column1         column2         column3         column4
-------         -------         -------         -------
va1             val2            val3
something_new_1 something_new_2 something_new_3 something_new_4
something_new_5 something_new_6 something_new_7 something_new_8

相关问题