PowerShell Import-Csv множественная CSV конкатенация столбцов - PullRequest
0 голосов
/ 20 января 2019

Я хотел бы импортировать несколько файлов .csv с 3 столбцами и 100 строками каждый в один файл .csv, причем каждый импорт идет в следующие 3 столбца (ABC - DEF - GHI), а не все объединяются в первые 3 столбца. с тысячами строк.

Я попытался Import-Csv, но не могу контролировать, где вывод находится. Придется ли мне прибегать к использованию COM-объекта (New-Object -ComObject excel.Application) или есть более чистый способ контролировать, в какие ячейки импортируется импорт?

Строки заголовка

PSComputerName,HotfixID,InstalledOn

Но мне нужно, чтобы каждый цикл записывался вместо нижнего.

PSComputerName,HotfixID,InstalledOn,PSComputerName,HotfixID,InstalledOn,PSComputerName,HotfixID,InstalledOn

1 Ответ

0 голосов
/ 21 января 2019

То, что вы описываете, не является типичным сценарием использования для CSV, и Import-Csv (или Export-Csv в этом отношении) не может справиться с этим вообще. Оба командлета преобразуют строки CSV в объекты со свойствами, названными в честь заголовков столбцов или наоборот. Следовательно, заголовки столбцов ДОЛЖНЫ быть уникальными, если вы хотите использовать командлеты *-Csv.

Простейший подход к тому, что вы пытаетесь сделать, возможно, будет выглядеть примерно так:

# read CSV data into distinct variables
$csv1 = Get-Content 'C:\path\to\1.csv'
$csv2 = Get-Content 'C:\path\to\2.csv'
$csv3 = Get-Content 'C:\path\to\3.csv'

# determine maximum number of rows
$max = $csv1.Count, $csv2.Count, $csv3.Count |
       Sort-Object
       Select-Object -Last 1

# concatenate corresponding rows from each file and write them to the output file
for ($i=0; $i -lt $csv1.Count; $i++) {
    # emulate missing rows in case the CSVs don't have the same number of rows
    $row1 = if ($csv1[$i]) {$csv1[$i]} else {',,'}
    $row2 = if ($csv2[$i]) {$csv2[$i]} else {',,'}
    $row3 = if ($csv3[$i]) {$csv3[$i]} else {',,'}

    "${row1},${row2},${row3}" | Add-Content 'C:\path\to\output.csv'
}
...