an34mem
Goto Top

Powershell Eine bestimmte Zeile in TXT Dateien auslesen, und ggf. Datei löschen

Hallo, und guten Morgen.

Ich möchte gern ein Verzeichnis mit mehreren TXT Dateien auslesen und ggf. bestimmte Dateien löschen lassen.

Hintergrund:
Bei dem Beispiel wird die 2 Zeile der TXT ausgegeben:
Get-Content "1.txt" -TotalCount 2 | Select-Object -Skip 1  
Get-Content "2.txt" -TotalCount 2 | Select-Object -Skip 1  
Get-Content "3.txt" -TotalCount 2 | Select-Object -Skip 1  

Jedoch wie ist es möglich, wenn z.B. die 2 Zeile von 1.txt und 3.txt identisch ist, dass 3.txt gleich gelöscht wird?

Danke für eine Hilfestellung.
Viele Grüße.

Content-ID: 4673321263

Url: https://administrator.de/forum/powershell-eine-bestimmte-zeile-in-txt-dateien-auslesen-und-ggf-datei-loeschen-4673321263.html

Ausgedruckt am: 19.12.2024 um 15:12 Uhr

SlainteMhath
SlainteMhath 18.11.2022 um 09:44:41 Uhr
Goto Top
Moin,

etwa so:
$a=(Get-Content "1.txt" -TotalCount 2 | Select-Object -Skip 1)  
$b=(Get-Content "2.txt" -TotalCount 2 | Select-Object -Skip 1)  
$c=(Get-Content "3.txt" -TotalCount 2 | Select-Object -Skip 1)  

if($a -eq $c) { remove-item ... }

lg,
Slainte
AN34Mem
AN34Mem 18.11.2022 um 09:56:16 Uhr
Goto Top
Danke für deinen Vorschlag.
An -eq hatte ich auch schon gedacht. Vielleicht hat jemand ein Vorschlag das alles in
einer Schleife, Array, und mit compare irgendwie zu machen.

Wenn jemand ggf. ein Freeware Programm dafür kennt, würde ich es auch
sehr begrüßen. Leider habe ich keins gefunden wenn es um ein Vergleich mit einer direkte
Zeile geht.
Crusher79
Crusher79 18.11.2022 um 10:02:24 Uhr
Goto Top
Hallo,

vlt. mal ein paar Textbeispiele? So ist es auch statisch. Da wird nicht viel automatisch durchlaufen. Ist der Aufbau immer gleich? Wieviele Datein sind es? Ändern sich die Dateinamen - also nicht durchnummeriert? Bsp. ist immer gut, aber wenn es nur wage die Sache skizziert nicht hilfreich!

Du müssttest irgendwo anfangen. Reihenfolge? Dateiname oder Datum? Dann den 1. Wert als Referenz speichern. Bei iterieren der anderen Dateien vergleichen und wenn ein match da ist die Datei an der Stelle löschen.

Was ist mit der Zeichenencodierung? Hat der Text Umlaute? Ggf. müsste das für andere Aktionen auch noch abgefangen werden. Zeig mal "echte" Beispiele + Inhalt.
AN34Mem
AN34Mem 18.11.2022 aktualisiert um 10:23:57 Uhr
Goto Top
Hallo Crusher79,
Die TXT Dateinamen gehen von 00001.txt bis 10000.txt
Der Aufbau der TXT ist immer gleich, und der Inhalt in der 2 Zeile (gleicher Satz) ist ggf. exakt gleich vorhanden.
Umlaute sind vorhanden, und die TXT Dateien liegen in UTF-8 BOM vor.

Die 2 Zeile beinhaltet einfach einen Satz.
z.B. Übermorgen ist Sonntag.
Wenn dieser Satz in der 2 Zeile unter anderem in einer erneuten durchsuchten Datei von 00001.txt bis z.B. 10000.txt steht soll diese gefundene Datei gelöscht werden.

Steht jedoch in einer anderen TXT in der 2 Zeile:
z.B. Morgen ist Samstag.
und ist dieser Satz auch doppelt in einer anderen TXT, dann soll diese Datei gelöscht werden.

Um es Kurz zu fassen. Der Inhalt in der 2 Zeile darf in allen durchsuchten TXT Dateien nur einmal vorkommen.
Crusher79
Crusher79 18.11.2022 um 10:27:37 Uhr
Goto Top
Hallo,

muss ich kurz drüber nachdenken! Da es mehrere Werte sind müsste man die alle speichern und vergleichen. Also Hastable oder Array. Den nur aktualisiseren, wenn der Wert noch nicht im Array steht. Ist er vorhanden gab es die Datei schon. Dann kann man also sofort löschen, da es eine Doublette ist. Weiß nur nicht wie performant das ist. Geht auf jedenfall. Müsste ich aber erst nachbauen.

1. Array mit Werte 2. Zeile füllen
2. Nach einlesen vergleichen, ob der Value schon vorhanden ist
- NEIN: Array Update und Datei überspringen
- JA: aktuelle Datei löschen

Du brauchst hier ja eine Datenbank mit Referenzwerten. Datebank ist grob formuliert. Objekt das gefundene Werte ohne Redundanz vorhält reicht doch aus....
4400667902
Lösung 4400667902 18.11.2022 aktualisiert um 10:29:26 Uhr
Goto Top
Get-ChildItem "D:\Ordner" -File -Filter *.txt | sort LastWriteTime | group {(Get-Content $_.Fullname -TotalCount 2)[1]} | ? Count -gt 1 | %{$_.Group | select -skip 1 | remove-item -verbose}  
AN34Mem
AN34Mem 18.11.2022 aktualisiert um 10:43:34 Uhr
Goto Top
Ohne Worte: ukulele

Das ist genau das was gesucht wurde!

Super Cool!

An alle die eine Hilfestellung gegeben haben:

Ein großes Danke - Der Freitag ist gerettet!
Tolles Forum. Bis dann...
Crusher79
Crusher79 18.11.2022 um 10:38:05 Uhr
Goto Top
Schau dir mal @4400667902 an!

Gruppen und dann logisch löschen, wo die Gruppe mehr als 1 Mitglied hat. das wäre die redundante Files. Teste mal seinen Beitrag!