spongebob24
Goto Top

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.

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

1915348599
1915348599 09.03.2022 aktualisiert um 10:25:54 Uhr
Goto Top
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'} | .......  
spongebob24
spongebob24 09.03.2022 um 10:35:08 Uhr
Goto Top
Hi,

danke für deine schnelle Antwort.

Muss ich das nicht mehr in den * angeben?

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"

Diese kommen eben in den CSV´s auch vor.
Brauchen würde ich eigentlich nur einen am Anfang der CSV, ist aber egal wenn er öfters vorkommt.

SG
1915348599
Lösung 1915348599 09.03.2022 aktualisiert um 10:49:51 Uhr
Goto Top
Zitat von @spongebob24:
Muss ich das nicht mehr in den * angeben?
Nein, hier gilt Regular Expression Syntax! Und hier wird per Default wildcard gematcht.
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"

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'  
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
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 «"Match the character “*” literally «\*»
   Match the character “"” literally «"»  

screenshot
spongebob24
spongebob24 09.03.2022 um 10:50:06 Uhr
Goto Top
Wow vielen Danke das war es.
Also verstehe ich richtig mit |^ könnte ich nun beliebig dazuhängen?

SG und Danke Bernd
1915348599
1915348599 09.03.2022 aktualisiert um 10:54:03 Uhr
Goto Top
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.
https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Weitere_Zeichen
spongebob24
spongebob24 09.03.2022 um 10:54:46 Uhr
Goto Top
Vielen Dank face-wink
spongebob24
spongebob24 11.03.2022 um 10:51:16 Uhr
Goto Top
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
1915348599
1915348599 11.03.2022 um 11:56:18 Uhr
Goto Top
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
Klar

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"}  
spongebob24
spongebob24 11.03.2022 um 12:16:37 Uhr
Goto Top
Hi,

danke für die schnelle Antwort.
Werde das mal so versuchen, habe in dem Ordner viele CSV Dateien und will diese eben zusammenfassen wo aber älter sind als 30 Minuten

Get-ChildItem C:\test\*.csv| ?{$_.LastWriteTime -lt (get-date).AddMinutes(-30)} | Add-Content C:\test\output.csv

Danke schönes WE