首页 > 解决方案 > 通过 pscustomobject 导出 csv,powershell 显示不正确

问题描述

我有以下代码:

    function realtest
    {
         $files = Get-ChildItem -Path 'D:\data\' -Filter *.csv
         $tester = [PSCustomObject]@{

         foreach ($file in $files)
         {
             $tempName = $file.BaseName
             $temp = Import-Csv $file
             $tester | Add-Member -MemberType NoteProperty -Name $tempName -Value $temp.$tempName
         }
         $tester
         $tester | Export-Csv "D:\result.csv" -NoTypeInformation
    }

我正在尝试将一堆数据导出到 CSV,但是当它在 csv 上显示数据时,它显示如下

"E0798T102","E0798T103"
"System.Object[]","System.Object[]"

但是当我在控制台上打印它时,它显示如下

E0798T102       E0798T103
---------       ---------
{0, 0, 0, 0...} {0, 0, 0, 0...}

最终,我希望 E0798T102 和 E0798T103 作为 result.csv 中的单独列

只是要注意,我将有 50 个 csv 循环,每个应该显示为自己的列

标签: arrayspowershellcsvexport-to-csv

解决方案


根据您的代码段,这可以大大简化:

function Get-Csv {
    $col = foreach ($file in Get-ChildItem -Path D:\data -Filter *.csv) {
        $csv = Import-Csv -Path $file.FullName
        [pscustomobject]@{
            $csv.($file.BaseName) = $csv
        }
    }
    $col | Export-Csv D:\result.csv -NoTypeInformation

    return $col
}

但是文件似乎是错误的方法,因为您试图在标题下嵌入对象。这实际上不适用于表格格式,因为您只能获得一层深度。您应该扩展对象上的所有属性,或者使用可以表示深度的不同格式,例如

格式化问题的原因是序列化的工作方式。您将获得对象的字符串表示形式。

转换为并不困难,您只需交易您的Export-Csv电话:

$col | ConvertTo-Json -Depth 100 | Out-File -FilePath D:\result.json

注意:我指定-Depth 100是因为 cmdlet 的默认值Depth2.


推荐阅读