AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76921424
Accepted
Zombievirus
Zombievirus
Asked: 2023-08-17 20:14:00 +0800 CST2023-08-17 20:14:00 +0800 CST 2023-08-17 20:14:00 +0800 CST

Import-CSV: adiciona linhas (membros) ao objeto resultante no loop foreach

  • 772

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?

powershell
  • 1 1 respostas
  • 33 Views

1 respostas

  • Voted
  1. Best Answer
    Santiago Squarzon
    2023-08-17T20:27:51+08:002023-08-17T20:27:51+08:00

    Esta é uma maneira de fazer isso, mas observe que este exemplo não verifica se Tier 1o objeto já existe para um Tier 0objeto.

    $newCsv = Import-Csv ... | ForEach-Object {
        $_
        if ($_.Tier -eq 0) {
            $copy = $_.PSObject.Copy()
            $copy.Tier = 1
            $copy
        }
    }
    

    Demonstração:

    @'
    FirstName|LastName|Tier
    George|Smith|0
    John|Fritz|1
    Thomas|Adams|1
    Manuel|Evans|0
    '@ | ConvertFrom-Csv -Delimiter '|' | ForEach-Object {
        $_
        if ($_.Tier -eq 0) {
            $copy = $_.PSObject.Copy()
            $copy.Tier = 1
            $copy
        }
    }
    
    FirstName LastName Tier
    --------- -------- ----
    George    Smith    0
    George    Smith    1
    John      Fritz    1
    Thomas    Adams    1
    Manuel    Evans    0
    Manuel    Evans    1
    

    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:

    $csv = Import-Csv ...
    $newCsv = foreach ($User in $csv) {
        $User
        if ($User.Tier -eq '0') {
            [pscustomobject]@{
                FirstName = $User.FirstName
                LastName  = $User.LastName
                Tier      = '1' 
            }
        }
    }
    

    Se você quiser adicionar $Csv sem produzir um novo array, a recomendação é usar um List<T>e seu .Addmétodo. Este método também requer um forloop em vez de, foreachcaso contrário, você receberia um erro devido à tentativa de modificar uma coleção durante a enumeração.

    [System.Collections.Generic.List[object]] $csv = Import-Csv ...
    for ($i = 0; $i -lt $csv.Count; $i++) {
        if ($csv[$i].Tier -eq '0') {
            $csv.Add([pscustomobject]@{
                FirstName = $User.FirstName
                LastName  = $User.LastName
                Tier      = '1' 
            })
        }
    }
    
    • 2

relate perguntas

  • Use e modifique minha variável em todo powershell startthreadjob

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve