zahnfee
Goto Top

Mit PowerShell eine Spalte einer CSV Datei bearbeiten

Hallo zusammen,

ich versuche verzweifelt mit PowerShell eine CSV Datei zu bearbeiten, bekomme es aber irgendwie nicht hin - vielleicht kann mir hier jemand bei meinem Problem helfen.

Ich habe eine Date mit z.B. folgendem Aufbau:

AR125522;1252524521325;0;
BA00522;1556524521325;4;
TXT-5522;5652524521325;5;
AZ126602;;12;
KIZ522-2;1252524527725;100;

Jetzt möchte ich die Datei lesen und die Spalte 3 auf eine Zahl von max. 5 begrenzen, also dass das Ergebnis danach so ausschaut:

AR125522;1252524521325;0;
BA00522;1556524521325;4;
TXT-5522;5652524521325;5;
AZ126602;;5;
KIZ522-2;1252524527725;5;

Alle Versuche sind bisher bei mir mangels Wissen gescheitert face-sad

Content-ID: 7071275084

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

Ausgedruckt am: 24.11.2024 um 13:11 Uhr

mayho33
mayho33 08.05.2023 um 19:45:55 Uhr
Goto Top
Zahnfee
Zahnfee 08.05.2023 um 19:52:10 Uhr
Goto Top
Hallo,
soweit war ich schon, allerdings bekomme ich es nicht hin die 3 Spalte entsprechend zu bearbeiten und die bearbeitete Datei wieder wegzuschreiben.
mayho33
mayho33 08.05.2023 aktualisiert um 20:29:21 Uhr
Goto Top
Holt die ersten 5 Zeilen ohne Header und wählt die Spalte "Name"

Get-Process | Export-Csv -Path "C:\myCSV.csv" | Select-Object -First 5 | Select Name | ft  

edit:

Get-Process | Export-Csv -Path "C:\myCSV.csv"  

[PSObject]$csv = import-csv -Path "C:\myCSV.csv" | Select-Object -First 5  

foreach ($c__ in $csv)
{
    $c__.Name = $c__.Name + "__bubu"    
    #$c__.Name
}
$csv | Export-Csv -path "C:\myCSV.csv" -Force  
7010350221
Lösung 7010350221 08.05.2023 aktualisiert um 20:42:37 Uhr
Goto Top
Hallo
# Dateipfad
$file = "d:\datei.csv"  
# Import mit Headerangabe in einfachen Zahlen 1-4 weil Ausgangsdatei ja offensichtlich keine Header hat
$csv = Import-Csv $file -Delimiter ";" -Header (1..4)  
# Jede Zeile des Objects durchlaufen
foreach($line in $csv){
    # wenn Wert in Spalte 3 größer als 5, Wert auf 5 setzen
    if ([int]$line.3 -gt 5){
        $line.3 = 5
    }
}
# Object in CSV-String konvertieren, Header wieder entfernen, Anführungszeichen ersetzen und zurück in die gleiche Datei schreiben.
($csv | convertto-csv -Delimiter ";" -NoTypeInformation | select -skip 1) -replace '"' | Set-Content $file  
Online-Demo

Grüße

@mayho33 Glaube du hast die Frage völlig missinterpretiert 😉
mayho33
mayho33 08.05.2023 um 21:52:15 Uhr
Goto Top
Zitat von @7010350221:
@mayho33 Glaube du hast die Frage völlig missinterpretiert 😉

Ne! Wiso? 🤔
Jetzt möchte ich die Datei lesen und die Spalte 3 auf eine Zahl von max. 5 begrenzen, also dass das Ergebnis danach so ausschaut:

Ob das jetzt die CSV ist oder eine andere ist egal. Das Beispiel soll veranschaulichen was möglich ist. Ich will es ihm/ihr außerdem nicht runterraspeln sondern beibringen 😉
Und wenn du ansprichst, dass die csv im Beispiel ja keine Header haben könnte, dann merke ich an, dass ein Import-CSV die erste Zeile immer als Header definiert.
StackOverflow
Was bsp IMB dazu schreibt

$csvPath = "C:\myCSV.csv"  
#===========================================
# Import der ersten 5 Zeilen. Man kann natürlich auch anders:
#===========================================
[PSObject]$csv = import-csv -Path $csvPath | Select-Object -First 5 #OPTIONAL: -Skip 11 -First 5

foreach ($c__ in $csv)
{
    #===========================================
    #Spalte x bearbeiten. Bei Process ist die Spalte 3 "VM" oder so. Wollte das nur veranschaulichen 
    #===========================================
    $c__.Name = $c__.Name + "__bubu"    
    #$c__.Name
}
#===========================================
# wieder speichern
#===========================================
$csv | Export-Csv -path $csvPath -Force
7010350221
7010350221 08.05.2023 aktualisiert um 22:00:02 Uhr
Goto Top
Zitat von @mayho33:
Und wenn du ansprichst, dass die csv im Beispiel ja keine Header haben könnte, dann merke ich an, dass ein Import-CSV die erste Zeile immer als Header definiert.
Ja schon klar, brauchst du mir nicht erklären ich arbeite schon >15 Jahre mit der PS, aber ob er in diesem Fall
AR125522;1252524521325;0;
als Header haben will wage ich doch stark zu bezweifeln, deswegen wurde das eben angenommen 😁.

So long, schönen Abend.
mayho33
mayho33 08.05.2023 um 22:28:00 Uhr
Goto Top
Zitat von @7010350221:

Zitat von @mayho33:
Und wenn du ansprichst, dass die csv im Beispiel ja keine Header haben könnte, dann merke ich an, dass ein Import-CSV die erste Zeile immer als Header definiert.
Ja schon klar, brauchst du mir nicht erklären ich arbeite schon >15 Jahre mit der PS, aber ob er in diesem Fall
Na dann ist ja alles gut! Es gibt bestimmt ganz viel Wege nach Rom. Wir haben je 1 aufgezeigt 👌

AR125522;1252524521325;0;
als Header haben will wage ich doch stark zu bezweifeln, deswegen wurde das eben angenommen 😁.
Haha! Wer weiß. Es gibt mehr Tools wie Sand am Meer die einen Export in eine CSV falsch machen. Genauso könnte der TO die CSV ja selbst erstllt haben ohne Header. In die Falle tappen doch so viele 😁🤷‍♂️

...und weil ich oben nicht mehr ändern durfte hier eine Erweiterung die der TO auch verstehen kann:

$regOpt = [System.Text.RegularExpressions.RegexOptions]::IgnoreCase
$csvPath = "C:\myCSV.csv"  

Get-Process | export-csv -Path $csvPath -Force

#===========================================
# Import der ersten 5 Zeilen. Man kann natürlich auch anders:
#===========================================
[PSObject]$csv = import-csv -Path $csvPath | Select-Object -First 5 #OPTIONAL: -Skip 11 -First 5

foreach ($c__ in $csv)
{
    #===========================================
    #Spalte x bearbeiten. Bei Process ist die Spalte 3 "VM" oder so. Wollte das nur veranschaulichen 
    #===========================================
    $c__.Name = $c__.Name + "__bubu"    

    #===========================================
    #Da ginge natürlich auch ein regex als filter (1-127 Handles)
    #===========================================
    if([regex]::Match($c__.Handles, "\b([1-9]|[1-9][0-9]|1[01][0-9]|12[0-7])\b", $regOpt).Success)  
    {
        "before: $($c__.Handles)"  
        $c__.Handles = 1
        "after: $($c__.Handles)"  
    }
}
#===========================================
# wieder speichern
#===========================================
$csv | Export-Csv -path $csvPath -Force


So long, schönen Abend.
Wünsche ich dir auch!
Zahnfee
Zahnfee 09.05.2023 um 10:33:52 Uhr
Goto Top
Ja super, das funktioniert einwandfrei.
Vielen lieben Dank.