PowerShell Mini- Ersetzen CSV Script

  • Ersteller Ersteller KeinNickFrei
  • Erstellt am Erstellt am
K

KeinNickFrei

Gast
Hallo zusammen,
es ist mir schon direkt peinlich, aber ich (der alle Jahre nur was skriptet) bekomme es gerade nicht besser hin.

Ziel:
Eine CSV Datei gehört modifiziert.An einer bestimmten Stelle sollen Werte eingefügt werden, wenn die Nr. entsprechend ist.
Konkret soll, wenn die Personalnummer mit "5" beginnt, ein Datumswert in Position 5 (Semikolon getrennt) eingefügt werden. Es ist NICHT sichergestellt, dass immer jeder Wert einen Inhalt hat.

Ich bekomme es echt nur prozedural hin. CSV-Import klappt nur mit Header und die bekomme ich nie wieder weg...

Mein Stand:

Code:
#VARIABLEN = $originalfile und $destinationfile

$users = Get-Content -Path $originalfile

# Import und Header manuell vorgeben
$users = Get-Content $originalfile -Encoding:string | convertfrom-csv -delimiter ";" -header "nr","pers1","pers2","Datum1","Datum2","vorname","nachname","pers3"

# Variable leeren für Tests...
$newusers = ""

foreach( $user in $users) {

if ($user.nr.StartsWith("5")){$user.Datum2 = "10-10-2018"}

#DAS ist der Part, der definitiv besser geht...
$newusers += $user.nr + ";"
$newusers += $user.pers1 + ";"
$newusers += $user.pers2 + ";"
$newusers += $user.Datum1 + ";"
$newusers += $user.Datum2 + ";"
$newusers += $user.vorname + ";"
$newusers += $user.nachname + ";"
$newusers += $user.pers3 + ";"
$newusers += "`r`n"

$newusers | Out-File $destinationfile

}

Beispiel $originalfile (Mit Umlauten, um zu prüfen, dass sie erhalten bleiben)
111;123;900;02-03-2002;;Erika;Doe;;
112;123;900;02-03-2002;;Erika;Märters;;
501;456;901;01-02-2001;;Max;Mustermann;;
502;456;901;01-02-2001;;Max;Möster;;

Beispiel $destinationfile (gewünschtes Ziel: bei den 5** Einträgen wurde "Datum2" mit einem Beispielwert gepflegt
111;123;900;02-03-2002;;Erika;Doe;;
112;123;900;02-03-2002;;Erika;Märters;;
501;456;901;01-02-2001;10-10-2018;Max;Mustermann;;
502;456;901;01-02-2001;10-10-2018;Max;Möster;;


Wie wäre es geschickter? :-/

Dankeschön!
 
warum nicht mit excel und einer formel? Da ist das Thema in zwei Minuten erledigt.
=WENN(LINKS(A1;1)=5;"10-10-2018";"")

Edit, ggf muss die 5 in Anführungszeichen stehen. Also so:
=WENN(LINKS(A1;1)="5";"10-10-2018";"")
 
Ist das eine wiederkehrende Tätigkeit? Man kann ansonsten CSV-Dateien auch mit Excel einlesen, dort dann die Daten wie gewünscht bearbeiten - inkl. etwaiger Formeln zur schnelleren Bearbeitung - und das Ergebnis dann erneut als CSV exportieren.

@rocketworm : Zwei Dum.. .. .. ne .. zwei Schlaue, ein Gedanke ;)
 
Raijin schrieb:
Ist das eine wiederkehrende Tätigkeit?

Terrean schrieb:
Eine CSV Datei gehört modifiziert.An einer bestimmten Stelle sollen Werte eingefügt werden, wenn die Nr. entsprechend ist.
Von daher bin ich jetzt von einmalig ausgegangen. Aber selbst wenn es wiederkehrend ist(oder eine andere Tabelle als Grundlage dient, Stichwort sverweis), kann man sich das mit Excel schick machen. Und wenn man da mit Formeln nicht mehr weiter kommt, sollte es in Excel mit VBA einfacher zu realisieren sein als auf der Powershell.
 
Also, ich hab das mal schnell "quick and dirty" geschrieben:

PowerShell:
#VARIABLEN = $originalfile und $destinationfile
$originalfile = "D:\00_Scripts\test.csv"
$destinationfile = "D:\00_Scripts\ende.csv"

# Import und Header manuell vorgeben
$users = Import-Csv -Path $originalfile -Delimiter ";" -header "nr","pers1","pers2","Datum1","Datum2","vorname","nachname","pers3"


foreach( $user in $users) {
    if ( $user.nr.Startswith("5")){
        $user.Datum2 = "10-10-2018"
    }
}

$Users | ConvertTo-Csv -Delimiter ";" -NoTypeInformation | Select-Object -Skip 1 | Set-Content $destinationfile

Das sollte so funktionieren und bei einem kurzen Test passte auch alles. Lass mich wissen, ob es so passt oder ob Du noch Änderungen brauchst.

Natürlich kann man das in Excel machen, aber wenn das wirklich immer wiederkehrend ist, kann man sowas schon statt mit Excel auch mit Powershell machen.
 
  • Gefällt mir
Reaktionen: IT_Nerd und KeinNickFrei
Hallo an alle,

ja, es ist eine wiederkehrende Aufgabe. Es soll täglich, automatisiert wiederholt werden, also geht Excel nicht.

@Rego
Die letzte Zeile sieht gut aus! Vielen Dank! Macht gleich mal viel Unterschied - Teile der Cmdlets hatte ich schon in Verwendung, aber nicht in der Kombi. Das "-skip 1" hatte mir immer die erste Datenreihe eleminiert anstatt dem Header....

Das "Import-CSV" hatte ich anfangs nicht genommen, weil die Datei nicht unbedingt in Unicode ist, trotz Sonderzeichen. Und beim Import-CSV wurde das oft ersetzt... deshalb hab ich mir da Code Schnippsel aus dem Netz geholt...



Jetzt ist aber noch das Problem, dass alle Daten in Anführungszeichen " sind.

Aus
Code:
112;123;900;02-03-2002;;Erika;Märters;;
501;456;901;01-02-2001;;Max;Mustermann;;

wurde
Code:
"112";"123";"900";"02-03-2002";"";"Erika";"Märters";""
"501";"456";"901";"01-02-2001";"10-10-2018";"Max";"Mustermann";""

Wie wäre das am geschicktesten wegzubekommen.
 
die Anführungszeichen sind aber so richtig im Standard-konformen CSV
 
Ja, das verstehe ich. Aber leider ist das Ausgangsformat (was nicht meinem Einfluss obliegt) so...
 
Code:
# Import und Header manuell vorgeben
$users = Get-Content $originalfile -Encoding:string | convertfrom-csv -delimiter ";" -header "nr","pers1","pers2","eintritt","austritt","vorname","nachname","pers3","pers4"

foreach( $user in $users) {
if ($user.nr.StartsWith("5")){$user.austritt = "10-10-2018"}
}

$Users | ConvertTo-Csv -Delimiter ";" -NoTypeInformation |Select-Object -Skip 1 | % {$_ -replace '"',''}| Set-Content $destinationfile

So komme ich auf das gewünschte Ergebnis, sofern ich nicht wieder was übersehen habe. Werde auch noch Tests mit anderen Variationen des Inputs machen, aber ansonsten wäre ich zufrieden.
Ich habe die beiden Vorschläge von @Rego und @abcddcba eingepflegt und einen zusätzliche spalte als header angegeben, damit das abschließende Semikolon eingepflegt wird. Die erste Zeile hab ich so beibehalten, weil ich sonst Probleme mit Umlauten bekam.

Vielen Dank!
 
  • Gefällt mir
Reaktionen: abcddcba
Zurück
Oben