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:
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:
Alle Versuche sind bisher bei mir mangels Wissen gescheitert
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7071275084
Url: https://administrator.de/contentid/7071275084
Ausgedruckt am: 24.11.2024 um 13:11 Uhr
8 Kommentare
Neuester Kommentar
Hi,
Das kannst du mit dem CmdLet Import-CSV.
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
Das kannst du mit dem CmdLet Import-CSV.
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
Holt die ersten 5 Zeilen ohne Header und wählt die Spalte "Name"
edit:
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
Hallo
Online-Demo
Grüße
@mayho33 Glaube du hast die Frage völlig missinterpretiert 😉
# 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
Grüße
@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
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 FallUnd 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.
AR125522;1252524521325;0;
als Header haben will wage ich doch stark zu bezweifeln, deswegen wurde das eben angenommen 😁.
So long, schönen Abend.
Zitat von @7010350221:
Na dann ist ja alles gut! Es gibt bestimmt ganz viel Wege nach Rom. Wir haben je 1 aufgezeigt 👌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 FallUnd 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.
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 😁🤷♂️als Header haben will wage ich doch stark zu bezweifeln, deswegen wurde das eben angenommen 😁.
...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.