Estou tentando obter o seguinte com dados CSV importados no Powershell:
o CSV tem a seguinte estrutura:
| FirstName | LastName | Tier |
| --------- | ------- | ---- |
| George | Smith | 0 |
| John | Fritz | 1 |
| Thomas | Adams | 1 |
| Manuel | Evans | 0 |
Eu importo os dados CSV da seguinte maneira:
$csv = Import-Csv csvfile.csv
Agora, aqui está o problema. Estou tentando adicionar mais algumas linhas ao objeto
$csv
Se um usuário for do nível 0, o mesmo usuário deverá ser adicionado ao objeto com o nível 1.
O objeto $csv resultante deve se parecer com:
| FirstName | LastName | Tier |
| --------- | ------- | ---- |
| George | Smith | 0 |
| John | Fritz | 1 |
| Thomas | Adams | 1 |
| Manuel | Evans | 0 |
| George | Smith | 1 |
| Manuel | Evans | 1 |
A ordem na qual as novas linhas da Camada 1 são colocadas no objeto não importa. Eles devem estar em algum lugar no objeto com todos os dados originais. Também não preciso das linhas de camada 1 resultantes em nenhum arquivo CSV. Eu só preciso que essas novas linhas (membros) façam parte do objeto $ csv com todos os outros dados intocados para que eu possa iterar pelos dados originais e novos no mesmo objeto usando um loop foreach.
O que eu tentei até agora sem resultados positivos:
$csv = Import-Csv csvfile.csv
foreach ($User in $csv){
$tier = $User.Tier -replace '\s',''
if($tier -eq '0'){
$csv+= @{FirstName= $User.FirstName; LastName=$User.LastName; Tier='1'}
}
}
outra tentativa sem resultados positivos:
$csv = Import-Csv csvfile.csv
foreach ($User in $csv){
$tier = $User.Tier -replace '\s',''
if($tier -eq '0'){
$csv | Add-Member -MemberType NoteProperty -Name 'FirstName' -Value $User.FirstName -Force
$csv | Add-Member -MemberType NoteProperty -Name 'LastName' -Value $User.LastName -Force
$csv | Add-Member -MemberType NoteProperty -Name 'Tier' -Value '1' -Force
}
}
Depois de falhar miseravelmente, vim buscar ajuda dos Wizards of StackOverflow.
Como posso conseguir isso? Como obtenho as linhas de nível 0 duplicadas com um valor de nível diferente, deixando todos os outros dados intocados no mesmo objeto?
Esta é uma maneira de fazer isso, mas observe que este exemplo não verifica se
Tier 1
o objeto já existe para umTier 0
objeto.Demonstração:
Sua primeira tentativa foi muito próxima, o problema é que você está adicionando um hashtable
@{ ... }
em vez de um objeto personalizado[pscustomobject]@{ ... }
ao$Csv
, então deve funcionar bem, mas você também deve tentar evitar,+=
pois é ineficiente, você pode fazer isso em vez disso, no end é muito semelhante ao meu exemplo acima:Se você quiser adicionar
$Csv
sem produzir um novo array, a recomendação é usar umList<T>
e seu.Add
método. Este método também requer umfor
loop em vez de,foreach
caso contrário, você receberia um erro devido à tentativa de modificar uma coleção durante a enumeração.