robdox
Goto Top

Spaltenwert einer CSV Datei ändern

Hallo,

ich frage mich, wie ich einen Spaltenwert einer CSV Datei ändern kann, wenn eine Bedingung X erfüllt ist. Hintergrund: Ich muss vor dem Import eines anderen Programmes prüfen, ob Werte einer Datenbanktabelle auch in der CSV sind, wenn nicht, soll ein String "IN" mit hinzugefügt werden.

Das Abprüfen, ob Wert von DB in CSV vorhanden ist klappt. Das Ändern dieser Spalte (Personal) von "12345" in "IN12345" ist mir fremd. Die Lösungsvorschläge im Netz sind nicht die, welche ich Abwandeln kann auf mein Beispiel.

Ich hoffe Ihr könnt mir helfen!

### SQL Funktion erstellen
function querySQL {
    Param(
        [string]$cSQL
    )
    # Connectionstring aus m3.config
    $connectionString = "...."  

    # SQL Verbindung aufbauen
    $connection            = New-Object system.data.SqlClient.SQLConnection($connectionString)
    $command               = New-Object system.data.sqlclient.sqlcommand($cSQL,$connection)
    $connection.Open()
    $adapter               = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset               = New-Object System.Data.DataSet
    
    # Tabelle erstellen
    $adapter.Fill($dataSet) | Out-Null
    $connection.Close()
    $dataSet.Tables
}

$QueryPers="select Anw1 from kund_ba where isnull(Anw1,'') <>''"  
$PersNr=(querySQL -cSQL $QueryPers).Anw1
$CSV_Path="C:\TEST2.csv"  
$CSV=Import-Csv -Path $CSV_Path -Delimiter ";"  

foreach($i in $CSV){
   foreach($x in $PersNr){
        if($x -eq $i.Personal){
            Write-Host $x "aus DB passt zu" $i.Personal  
          #Wie kann nun $i.Personal zu "IN"+i.Personal in der CSV - TEST2.csv werden?  
        }
    }
}

Danke vorab!

Content-ID: 562018

Url: https://administrator.de/contentid/562018

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

TK1987
TK1987 31.03.2020 um 13:49:24 Uhr
Goto Top
Moin,

foreach($i in $CSV){
    foreach($x in $PersNr){
         if($x -eq $i.Personal){
             Write-Host $x "aus DB passt zu" $i.Personal  
           #Wie kann nun $i.Personal zu "IN"+i.Personal in der CSV - TEST2.csv werden? 
             $i.Personal="IN"+$i.Personal  
         }
     }
 }

Gruß Thomas
robdox
robdox 31.03.2020 um 13:54:54 Uhr
Goto Top
Mir ist schon klar wie ich eine Zeichenkette verändere, wie bekomme ich diese wieder genau in die CSV geschrieben?

foreach($i in $CSV){
   foreach($x in $PersNr){
      if($x -eq $i.Personal){
        $i.Personal="IN"+$i.Personal  
        Export-Csv -NoTypeInformation -Delimiter ";" -Append -LiteralPath "C:\TEST_XXXX.csv"  -InputObject $CSV # Hier scheitere ich  
      }
    }
 }
robdox
robdox 31.03.2020 aktualisiert um 14:05:21 Uhr
Goto Top
Ok ich bin einen Schritt weiter. Jetzt werden aber alle Zeilen überschrieben mit einem Wert. Was mach ich falsch im Code?

foreach($i in $CSV){
   foreach($x in $PersNr){
      if($x -eq $i.Personal){
        $i.Personal="IN"+$i.Personal  
        ConvertTo-Csv -NoTypeInformation -Delimiter ";" -InputObject $i | Out-File "C:\TEST_XXX11.csv" -Append  
      }
    }
 }

Ursprungs CSV
Name1;Name3;Name1_0;Leer;Personal;Name1_1;Name1_2;Kunden;Leer2;Leer3;Leer4;Str1;Str1_2;Str1_3
TOPTD1;1123;Airbus Defence and Space GmbH, Sat.;OTN;22334455;RM;4187;Airfence&Space GmbH;1111;EADS Astrium;OTN Bau 06.1;OG1;6.1/104A_3
TOP123;1100;Airbus Defence and Space GmbH, Sat.;OTN;22330055;RM;4187;Airfence&Space GmbH;1111;EADS Astrium;OTN Bau 06.1;OG1;6.1/104A_3
TOP124;1199;Airbus Defence and Space GmbH, Sat.;OTN;22331100;RM;4187;Airfence&Space GmbH;1111;EADS Astrium;OTN Bau 06.1;OG1;6.1/104A_3

Ausgabe nun immer mit Header dazwischen, soll auch nicht sein sowie Umhüllungszeichen für jedes Datenfeld.

"Name1";"Name3";"Name1_0";"Leer";"Personal";"Name1_1";"Name1_2";"Kunden";"Leer2";"Leer3";"Leer4";"Str1";"Str1_2";"Str1_3"  
"TOP123";"1100";"Airbus Defence and Space GmbH, Sat.";"OTN";"IN22330055";"R";"M";"4187";"Airfence&Space GmbH";"1111";"EADS Astrium";"OTN Bau 06.1";"OG1";"6.1/104A_3"  
"Name1";"Name3";"Name1_0";"Leer";"Personal";"Name1_1";"Name1_2";"Kunden";"Leer2";"Leer3";"Leer4";"Str1";"Str1_2";"Str1_3"  
"TOPTD1";"1123";"Airbus Defence and Space GmbH, Sat.";"OTN";"IN22334455";"R";"M";"4187";"Airfence&Space GmbH";"1111";"EADS Astrium";"OTN Bau 06.1";"OG1";"6.1/104A_3"  
"Name1";"Name3";"Name1_0";"Leer";"Personal";"Name1_1";"Name1_2";"Kunden";"Leer2";"Leer3";"Leer4";"Str1";"Str1_2";"Str1_3"  
"TOP123";"1100";"Airbus Defence and Space GmbH, Sat.";"OTN";"IN22330055";"R";"M";"4187";"Airfence&Space GmbH";"1111";"EADS Astrium";"OTN Bau 06.1";"OG1";"6.1/104A_3"  
TK1987
Lösung TK1987 31.03.2020 aktualisiert um 14:33:12 Uhr
Goto Top
Zitat von @robdox:
Ok ich bin einen Schritt weiter. Jetzt werden aber alle Zeilen überschrieben mit einem Wert. Was mach ich falsch im Code?
Das geht alles viel kürzer:
$CSV | Where-Object {$PersNr -match $_.Personal} | Foreach-Object {
  $_.Personal='IN'+$_.Personal  
  }
$CSV | Export-CSV -Delimiter ';' -NoTypeInformation $CSV_Path  
Ausgabe nun immer mit Header dazwischen, soll auch nicht sein
Du sollst die Ausgabe auch nicht schon in der Foreach-Schleife starten. Die Foreach-Schleife ändert nur deine $CSV-Variable, die gibst du anschließend in einem Rutsch aus - und natürlich mit Export-CSV.
sowie Umhüllungszeichen für jedes Datenfeld.
Ist so bei Powershell, bei CSV-Dateien werden die Spalten immer in Double-Quotes ausgegeben. Entspricht aber auch den CSV-Formatvorgaben.

Gruß Thomas
robdox
robdox 31.03.2020 um 14:29:04 Uhr
Goto Top
Alles klar, das hab ich verstanden ich war syntaktisch komplett daneben. Schön mit den Pipes auch so arbeiten zu können, vielen Dank!!