tilbum
Goto Top

CSV Datensätze anpassen mit Powershell

Hallo Liebe Community,


aus gegebenen Anlass muss ich nun ein Script erstellen, welches die Werte meiner CSV Datei anpasst.
Ich müsste das als Powershellscript lösen und später werde ich das einfach in der Aufgabenplanung als Aufgabe (periodisch) ausführen.


Die Daten in der CSV kommen aus einer Quelle, auf die ich leider keinen Zugriff habe entsprechend bleibt mir nur die Möglichkeit diese CSV zu importieren / bearbeiten und an einem anderen Pfad abzulegen. Dort wird sie von einer anderen Software verarbeitet.


beispielhafte Struktur CSV:

ID;NUMMER;Sacharbeiter;DienstleistungsNr;Datum;Start;Ende
ZS09999;32777;MM;1001;01.07.2020;14:08;17:29

So ungefair könnt ihr euch die CSV vorstellen. Was ich nun machen muss ist die Spalte NUMMER wie folgt abzuändern.


Jeder Wert in NUMMER soll mit 32.000 Subtrahiert werden.

Bei der Nummer handelt es sich um eine Fortlaufende Nummer wenn wir da die 32000 Subtrahieren können wir trotzdem ohne probleme mit den Werten arbeiten

Entsprechend sollte das dann ungefair so aussehen
Vorher Nacher
32777 777
32778 778
33779 779

Das ganze scheint mir nicht ganz so trivial, daher wende ich mich mal an euch. Evtl hat da jmd erfahrungen und kann mir da weiterhelfen?
Ich danke es euch im Voraus!

Bleibt gesund

Content-Key: 585392

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

Ausgedruckt am: 29.03.2024 um 07:03 Uhr

Mitglied: TK1987
TK1987 07.07.2020 aktualisiert um 09:28:35 Uhr
Goto Top
Moin,

$CSV=Import-Csv -d ';' C:\Test.csv  
$CSV|%{$_.NUMMER-=32000}
$CSV|Export-Csv -d ';' -nti C:\Test.csv  
zur Info: das % ist ein Alias für Foreach-Object

Gruß Thomas
Mitglied: 144705
144705 07.07.2020 aktualisiert um 09:33:57 Uhr
Goto Top
(Import-CSV 'd:\data.csv' -Delimiter ";") | %{$_.NUMMER = [int]$_.NUMMER - 32000;$_} | Export-CSV 'd:\data_neu.csv' -Delimiter ";" -NoType -Encoding UTF8  
Mitglied: TilBum
TilBum 07.07.2020 um 09:39:27 Uhr
Goto Top
Danke dir vielmals face-smile

Wäre es auch möglich die zweite Splate anzusteuern, wenn man in der CSV datei keinen Header hätte?
Entsprechend keine Bezeichnung der Spalten.
Mitglied: TilBum
TilBum 07.07.2020 um 09:40:02 Uhr
Goto Top
Danke dir vielmals face-smile
Mitglied: 144705
144705 07.07.2020 aktualisiert um 09:48:56 Uhr
Goto Top
Wäre es auch möglich die zweite Splate anzusteuern, wenn man in der CSV datei keinen Header hätte?
Entsprechend keine Bezeichnung der Spalten.
Kein Thema
(Import-CSV 'd:\data.csv' -Delimiter ";" -Header (1..8)) | %{$_.2 = [int]$_.2 - 32000;$_} | ConvertTo-CSV -Delimiter ";" | Select -Skip 1 | out-file 'd:\data_neu.csv'  
Mitglied: TilBum
TilBum 07.07.2020 um 13:47:06 Uhr
Goto Top
Danke dir vielmals.
Jetzt habe ich wohl doch noch ein Problem.


Hat da evtl. noch jmd einen Rat wie ich diese genannten Probleme lösen kann?

1. CSV in TXT datei ohne die Gänsefüßchen
2.Header soll nicht übernommen werden
3. Filter das nur die werte mit 32000 subtrahiert werden, die höher als 32.667 ist.


Zu 1. Undzwar muss ich die CSV Datei nun eigentlich als TXT abspeichern. Dachte mit einem einfacher "Rename-Item" könnte ich das einfach lösen.
Allerdings werden dann die Gänsefüßchen von der um den "Delimiter" ";" mit in der TXT Datei ausgegeben.

Wie folgt:

"1";"2";"3";"4";"5";"6";"7";"8";"9";"10";"11";"12"

im wesentlichen hatte ich mit
1;2;3;4;5;6;7;8;9;10;11;12
gerechnet.

Zu 2.Auch habe ich das Problem, dass der Header trotzdem mit ausgegeben wird.
Das Select -Skip 1 hab ich darin enthalten gehabt. Auch mit | Format-Table -HideTableHeaders hat es nicht funktioniert.

Zu 3. Ein Filter der nur die wärte abfängt die hhöher als 32667 sind.
Mitglied: 144705
Lösung 144705 07.07.2020 aktualisiert um 15:20:16 Uhr
Goto Top
1. 2. 3.

Testdatei (test.csv) Inhalt hat laut deiner Aussage keine Header:
ZS09999;32777;MM;1001;01.07.2020;14:08;17:29
ZS09999;32778;MM;1001;01.07.2020;14:08;17:29
ZS09999;32779;MM;1001;01.07.2020;14:08;17:29
ZS09999;23455;MM;1001;01.07.2020;14:08;17:29

Code darauf angewendet:
$IN = 'D:\test.csv'  
$OUT = 'D:\test.txt'  
((Import-CSV $IN -Delimiter ";" -Header (1..7)) | %{  
    if ([int]$_.2 -gt 32667){$_.2 -= 32000}
    $_
} | ConvertTo-CSV -Delimiter ";" -NoType) -replace '"','' | Select -Skip 1 | out-file $OUT  

Ergebnis (test.txt):

ZS09999;777;MM;1001;01.07.2020;14:08;17:29
ZS09999;778;MM;1001;01.07.2020;14:08;17:29
ZS09999;779;MM;1001;01.07.2020;14:08;17:29
ZS09999;23455;MM;1001;01.07.2020;14:08;17:29

So jetzt darfst du selbst was üben wenn du noch mehr willst: https://docs.microsoft.com/de-de/powershell/

Und wech ....