Экспорт CSV через pscustomobject отображает неправильно PowerShell - PullRequest
0 голосов
/ 18 марта 2019

У меня есть следующий код:

    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 для цикла, и каждый из них должен отображаться как свой собственный столбец

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Вот невероятно неэффективный ответ на ваш вопрос. Если оставить его как есть, предполагается, что ваши CSV-файлы уже имеют заголовок с базовым именем CSV-файла:

$CSVs = Get-ChildItem -path 'D:\data\' -filter "*.csv" -file
$headers = $CSVs.basename
$table = [System.Data.DataTable]::new("Files")
foreach ($header in $headers) {
    $table.Columns.Add($header) | out-null
}
foreach ($CSV in $CSVs) {
    #$contents = Import-Csv $CSV -Header $CSV.basename # If CSV has no header
    $contents = Import-Csv $CSV # If CSV contains header
    $rowNumber = 0
    foreach ($line in $Contents) {
        $rowcount = $table.rows.count
        if ($rowNumber -ge $rowCount) {
            $row = $table.NewRow()
            $row[$CSV.basename] = $line.$($CSV.basename)
            $table.Rows.Add($row)

        }
        else {
            $row = $table.rows[$rowNumber]
            $row[$CSV.basename] = $line.$($CSV.basename)

        }

        $rowNumber++
    }
}
$table | Export-Csv output.csv -NoTypeInformation   

Вы можете раскомментировать закомментированную строку $contents, если ваши CSV-файлы не имеют заголовка. Вам нужно будет просто закомментировать следующее $contents присвоение переменной, если вы раскомментируете первое.

0 голосов
/ 18 марта 2019

Исходя из вашего фрагмента, это может быть значительно упрощено:

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, поскольку по умолчанию для командлета Depth установлено значение 2.

.
...