Как объединить файлы CSV с уникальными заголовками и показать выходные данные каждого CSV в строке? - PullRequest
0 голосов
/ 08 декабря 2018

Я видел множество примеров того, как комбинировать файлы CSV, но ни один из них не совсем соответствует тому, что я пытаюсь достичь.У меня есть несколько файлов CSV, которые содержат только 1 строку, но несколько столбцов.Каждый заголовок может отличаться в каждом CSV, но у них есть общее имя столбца между ними.Вывод, который я хочу сделать, заключается в добавлении всех заголовков из каждого CSV-файла (независимо от того, является ли указанное значение нулевым или нет) в строку 1 моего выходного CSV-файла.Затем я хочу выровнять вывод каждой строки CSV в строку в выходном файле CSV и заполнить каждый столбец соответствующим образом, оставив пустыми те, которым не присвоены значения.

CSV1:

Name,Date,Year,Country
Bill,May 2018,1962,Canada

CSV2:

Profile,Prov,Size,Name
1,ON,14,Steve

CSV Финал:

Name,Profile,Size,Date,Year,Prov,Country
Bill,,,May 2018,1962,,Canada
Steve,1,14,,,ON,,

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Импорт, извлечение, построение и экспорт ...

$files = 'csv1.csv','csv2.csv'
$outputcsv = 'final.csv'

# import all files
$csv = $files | Import-Csv 

# extract columns from all files
$columns = $csv | ForEach {
    $_ | Get-Member -MemberType NoteProperty | Select -ExpandProperty Name
}

# construct an object (from file 1) with all the columns
# this will build the initial csv
# (SilentlyContinue on members that already exist)

$columns | ForEach {
    Add-Member -InputObject $csv[0] -Name $_ -MemberType NoteProperty -Value '' -ErrorAction SilentlyContinue
}

# export first object - and build all columns
$csv | Select -First 1 | Export-Csv -Path $outputcsv -NoTypeInformation

# export the rest
# -force is needed, because only 1st object has all the columns
$csv | Select -Skip 1 | Export-Csv -Path $outputcsv -NoTypeInformation -Force -Append

# show files
($files+$outputcsv) | ForEach { "$_`:"; (Get-Content -LiteralPath $_); '---' }

Редактировать: нет необходимости переосмысливать экспорт.Достаточно одной строки: $ csv |Export-Csv -Path $ outputcsv -NoTypeInformation

0 голосов
/ 08 декабря 2018

Хотя будет еще один вариант сделать это в одном вкладыше с Join-Object, вы можете получить этот командлет в PSGallery.

Find-Script join-object | Install-Script -Verbose -Scope CurrentUser

ниже работает,

(Join-Object -Left $CSV1 -Right $CSv2 -LeftJoinProperty Name -RightJoinProperty Name ), (Join-Object -Left $CSV2 -Right $CSV1 -LeftJoinProperty Name -RightJoinProperty Name -Type AllInLeft) | Export-Csv -Path c:\CombinedCsv.csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...