Powershell CSV Zeilen filtern und in neue CSV Datei schreiben
Hi zusammen,
ich habe mir eine Powershell erstellt, wo ich mehrere CSV Dateien in eine Merge und dann auf eine immer wiederkehrendes Wort filtere und diese dann in eine neue CSV schreibe, da ich dort eben nur die besagten Zeilen benötige.
Nun meine Frage, ich filtere mit folgenden PS Befehl
(gc '\\PFAD\output.csv') | ?{$_ -like '*Frei*'} | sc '\\Pfad\Frei\frei.csv'
das klappt auch alles ganz wunderbar.
Nun habe ich aber auch einen zusätzlichen Satz in den CSV´s wo ich benötigen würde.
Irgendwie bin ich auf dem Holzweg, dieser beinhaltet immer "K*"| am Anfang.
Kann ich den in den Befehl zusätzlich einbauen?
Irgendwie komme ich da nicht drauf.
SG und vielen Dank vorab für die Hilfe.
ich habe mir eine Powershell erstellt, wo ich mehrere CSV Dateien in eine Merge und dann auf eine immer wiederkehrendes Wort filtere und diese dann in eine neue CSV schreibe, da ich dort eben nur die besagten Zeilen benötige.
Nun meine Frage, ich filtere mit folgenden PS Befehl
(gc '\\PFAD\output.csv') | ?{$_ -like '*Frei*'} | sc '\\Pfad\Frei\frei.csv'
das klappt auch alles ganz wunderbar.
Nun habe ich aber auch einen zusätzlichen Satz in den CSV´s wo ich benötigen würde.
Irgendwie bin ich auf dem Holzweg, dieser beinhaltet immer "K*"| am Anfang.
Kann ich den in den Befehl zusätzlich einbauen?
Irgendwie komme ich da nicht drauf.
SG und vielen Dank vorab für die Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2099172328
Url: https://administrator.de/forum/powershell-csv-zeilen-filtern-und-in-neue-csv-datei-schreiben-2099172328.html
Ausgedruckt am: 22.12.2024 um 18:12 Uhr
9 Kommentare
Neuester Kommentar
Nimm einfach den -match statt den Like-Operator im Where-Object da hast du mit Regex und dem | (Or) alle Möglichkeiten
....... | ?{$_ -match 'Frei|^K'} | .......
Nein, hier gilt Regular Expression Syntax! Und hier wird per Default wildcard gematcht.
OK die Anführungszeichen müssen hier natürlich berücksichtigt werden in dem Fall sieht das dann so aus
Da du das Sternchen offensichtlich "literal" matchen willst (war in deinem Post leider nicht eindeutig) muss dieses escaped werden da das Sternchen in Regex Syntax besondere Bedeutung hat.
Das Caret (^) bedeutet, matche das folgende nur am Zeilenanfang!
Das | ist in regex--Syntax übrigens ein OR-Operator.
Bitte mal lesen, dann verstehst du den Ausdruck auch ...
Regular Expressions Tutorial
Hier die Erklärung in PlainText
Ich will eben meinen K Satz vor die anderen Sätze schreiben, aber im K Satz können auch öfters mehrere K vorkommen.
Darum müsst ich glaube mit "K*"| oder?
Der ganz Satz würde so aussehen.
"K*"|"36178"|""|"36178"|""|""|""|""|""|"07.03.2022"|"09.03.2022"|"10:30:00"|"09.03.2022"|"09:30:00"|""|""|"3000095"|""|""|""|""|""|""|""|""|""|""|""|""|"DE"|"Food / Non-Food"|"2503617800004"
Darum müsst ich glaube mit "K*"| oder?
Der ganz Satz würde so aussehen.
"K*"|"36178"|""|"36178"|""|""|""|""|""|"07.03.2022"|"09.03.2022"|"10:30:00"|"09.03.2022"|"09:30:00"|""|""|"3000095"|""|""|""|""|""|""|""|""|""|""|""|""|"DE"|"Food / Non-Food"|"2503617800004"
OK die Anführungszeichen müssen hier natürlich berücksichtigt werden in dem Fall sieht das dann so aus
(gc '\\PFAD\output.csv') | ?{$_ -match 'Frei|^"K\*"'} | sc '\\Pfad\Frei\frei.csv'
Das Caret (^) bedeutet, matche das folgende nur am Zeilenanfang!
Das | ist in regex--Syntax übrigens ein OR-Operator.
Bitte mal lesen, dann verstehst du den Ausdruck auch ...
Regular Expressions Tutorial
Hier die Erklärung in PlainText
Frei|^"K\*"
Match this alternative «Frei»
Match the character string “Frei” literally «Frei»
Or match this alternative «^"K\*"»
Assert position at the beginning of the string «^»
Match the character string “"K” literally «"K»
Match the character “*” literally «\*»
Match the character “"” literally «"»
Zitat von @spongebob24:
Wow vielen Danke das war es.
Also verstehe ich richtig mit |^ könnte ich nun beliebig dazuhängen?
Ja, aber das CARET (^) brauchst du nur wenn der darauf folgenden Token zwingend am Zeilenanfang vorkommen soll, ansonsten wird der an einer beliebigen Stelle in der Zeile gesucht.Wow vielen Danke das war es.
Also verstehe ich richtig mit |^ könnte ich nun beliebig dazuhängen?
https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Weitere_Zeichen
Zitat von @spongebob24:
HI,
kurze Frage noch. Ich lese die Dateien ja mit get-Content ein, kann ich da eine Zeit mitgeben? Also nur Dateien älter als 30 Minuten?
SG
KlarHI,
kurze Frage noch. Ich lese die Dateien ja mit get-Content ein, kann ich da eine Zeit mitgeben? Also nur Dateien älter als 30 Minuten?
SG
Get-ChildItem '\\Server\Freigabe\Pfad' -file -Filter *.csv | ?{$_.LastWriteTime -lt (get-date).AddMinutes(-30)} | %{(gc $_.Fullname) | ?{$_ -match 'Frei|^"K\*"'} | sc "\\Server\Freigabe\Pfad\$($_.Basename)_neu.csv"}