После долгих поисков я подумал, что самый простой способ манипулировать записями без воссоздания управляющей инфраструктуры - через hashtable .В ходе процесса мне пришлось учесть два крайних случая:
- дополнительные запятые в значениях
- пустые значения
Окончательное решение, которое я получил, это:
$configuration = Import-Csv .\configuration.csv
$customization = Import-Csv .\customization.csv
$merged = New-Object System.Collections.ArrayList
$hashTable = @{}
#initializing the hashTable with the defaults
foreach ($entry in $configuration)
{
$hashTable[$entry.path + ',' + $entry.item] = $entry.value + ',' + $entry.type
}
#updating the hashTable with customization that add or overwrite existing entries
foreach ($entry in $customization)
{
$hashTable[$entry.path + ',' + $entry.item] = $entry.value + ',' + $entry.type
}
#the regex handles multiple commas and empty values.
#It returns an empty string before and after group so we start from 1
foreach ($key in $hashTable.keys)
{
$psobject = [PSCustomObject]@{
path = ($key -split '(.*),(.*)')[1]
item = ($key -split '(.*),(.*)')[2]
value = ($hashTable[$key] -split '(.*),(.*)')[1]
type = ($hashTable[$key] -split '(.*),(.*)')[2]
}
[void] $merged.Add($psobject)
}
Write-Output $merged
После импорта я преобразую configuration.csv
в хеш-таблицу с ключами, состоящими из path
и value
.Затем я делаю то же самое с customization.csv
, используя ту же самую hashTable, которая перезаписывает любые существующие значения key
или добавляет их как новые.
Третий цикл преобразует hashTable в PSCustomObject
, аналогично тому, что делает Import-Csv
,Я разделяю каждый из атрибутов key
и value
при учете нескольких запятых, а также пустых значений.
ПРИМЕЧАНИЕ : регулярное выражение будет разделено на последнее вхождение разделителя (здесь это запятая,но вы можете выбрать что угодно, правда).Если вы хотите разделить на первое, вы можете использовать (.*?),(.*)
.В моем случае только столбец value
может содержать экземпляр разделителя.
Если CSV имеет уникальный столбец, то можно использовать решение, подобное , этот ответ .
Другой альтернативой является установка ключей равными сумме всех столбцов, и это отфильтровывает любые дубликаты в CSV, но разбиение может стать сложным, в зависимости от значений в столбцах.