Durchsuchen alle Zeilen einer Textdatei und die gleiche Zeilen herausfiltern und anzeigen
Guten Abend,
Ich melde mich ernuet mit der Bitte mir falls möglich zu helfen.
Ich muss aus einigen txt-Dateien die sehr viele eingescannte Zeilen enthalten, herausfinden ob Wiederholungen zu finden sind.
Die Zeilen sind vorab nummeriert und schauen so aus:
1: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0001
2: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0002
3: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0003
4: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0004
5: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0005
6: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0006
7: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0006
8: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0008
9: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0009
10: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0010
11: etc
yymmdd = Datum, hier absichtlich die Zeile 7: ist = Zeile 6:.
Da es um hunderten von Zeilen sich handelt können möglicherweise die laufende Nummer aus versehen sich oft wiederholen (man hat daneben mit dem Scanner gezielt, oder wurde bei der Arbeit gestört, etc...).
Ich hätte gerne die Zeilen wo die Scandaten sich wiederholen herausfiltern und zwar deren Nummer (z.B. hierzu die 7: und evtl auch die laufende Nr.die falsch gescannt wurde, hierzu 0006 signalisieren.
Ich versuche seit einer geräumen Zei etwas zu erstellen aber ofensichtlich meine Kenntnise reichen dafür nicht aus. Ich habe auch auf diese IE-Seite und auch allgemein im Internet viel gesucht aber entweder habe ich nicht die richtige Suchbegriffe genannt oder gibt es wirklich kein Thema darüber.
Ich fürchte, dass das Problem einfach zu lösen ist aber hilft nichts, ich kann es selber nicht lösen.
Kann mir jemand bei dem Problem helfen?
Vielen Dank,
Ich melde mich ernuet mit der Bitte mir falls möglich zu helfen.
Ich muss aus einigen txt-Dateien die sehr viele eingescannte Zeilen enthalten, herausfinden ob Wiederholungen zu finden sind.
Die Zeilen sind vorab nummeriert und schauen so aus:
1: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0001
2: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0002
3: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0003
4: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0004
5: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0005
6: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0006
7: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0006
8: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0008
9: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0009
10: ABCDEFGHIJKLMNOPQRS#01T#abcdef_yymmdd0010
11: etc
yymmdd = Datum, hier absichtlich die Zeile 7: ist = Zeile 6:.
Da es um hunderten von Zeilen sich handelt können möglicherweise die laufende Nummer aus versehen sich oft wiederholen (man hat daneben mit dem Scanner gezielt, oder wurde bei der Arbeit gestört, etc...).
Ich hätte gerne die Zeilen wo die Scandaten sich wiederholen herausfiltern und zwar deren Nummer (z.B. hierzu die 7: und evtl auch die laufende Nr.die falsch gescannt wurde, hierzu 0006 signalisieren.
Ich versuche seit einer geräumen Zei etwas zu erstellen aber ofensichtlich meine Kenntnise reichen dafür nicht aus. Ich habe auch auf diese IE-Seite und auch allgemein im Internet viel gesucht aber entweder habe ich nicht die richtige Suchbegriffe genannt oder gibt es wirklich kein Thema darüber.
Ich fürchte, dass das Problem einfach zu lösen ist aber hilft nichts, ich kann es selber nicht lösen.
Kann mir jemand bei dem Problem helfen?
Vielen Dank,
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 311943
Url: https://administrator.de/forum/durchsuchen-alle-zeilen-einer-textdatei-und-die-gleiche-zeilen-herausfiltern-und-anzeigen-311943.html
Ausgedruckt am: 21.04.2025 um 23:04 Uhr
17 Kommentare
Neuester Kommentar

Powershell
Regards
$txt = 'C:\data.txt'
$unique = @()
gc $txt | %{
$data = $_.Split(" ",2)[1]
if($data -in $unique){
"Duplicate in row $($_.Split(":")) with running number $($_.Substring($_.Length-4))"
}else{$unique += $data}
}
Hallo Mihail.
PowerShell Scripts haben die Endung .ps1
Wenn du es aus einem Batchscript aufrufen willst, dann bspw. so:
... mit "test.ps1" im gleichen Verzeichnis wie deine Batchdatei.
Eine Lösung per Batch ist sicher auch denkbar, aber ungleich komplizierter und nicht empfehlenswert.
Bspw.
Grüße
rubberman
PowerShell Scripts haben die Endung .ps1
Wenn du es aus einem Batchscript aufrufen willst, dann bspw. so:
powershell -NoProfile -ExecutionPolicy Bypass -Command "& '.\test.ps1'"
Eine Lösung per Batch ist sicher auch denkbar, aber ungleich komplizierter und nicht empfehlenswert.
Bspw.
@echo off &setlocal
set "txtfile=scan.txt"
for /f "usebackq tokens=1* delims=:" %%i in ("%txtfile%") do (
set "check="
for /f "tokens=1* delims=:" %%k in ('findstr /nec:":%%j" "%txtfile%"') do if %%k gtr %%i (
set "line=%%l"
setlocal EnableDelayedExpansion
echo(!line!|findstr /vbc:"%%i:" >nul && if not defined check (set "check=1" &echo Duplicate in row %%k with running number !line:~-4!)
for /f %%l in ("!check!") do endlocal &set "check=%%l"
)
)
pause
Grüße
rubberman
Hallo Mihail,
und beiden Welten (Batch/Powershell) kombiniert in deiner Batch als Quasi Einzeiler (wenn man von der Deklaration der Variablen absieht):
Der Batch-Powershell Code macht nichts anderes als alle Zeilen deiner Textdatei einzulesen, dann an das CMDLet group-object zu übergeben welches die Zeilen gesplittet am Doppelpunkt vergleicht und gruppiert um dann nur die Gruppen zu übernehmen bei der mehr als 2 Zeilen existieren und aus diesen dann nur alle doppelten Zeilen auszugeben.
Grüße Uwe
p.s. Powershell macht richtig Spaß wenn du die ersten Hürden überwunden hast. Es ist definitiv einen zweiten Blick wert, zumal sie unter Windows Betriebsystemen schon seit langem zum Standard geworden ist und erheblich Schreibarbeit und Entwicklungszeit einspart.
und beiden Welten (Batch/Powershell) kombiniert in deiner Batch als Quasi Einzeiler (wenn man von der Deklaration der Variablen absieht):
@echo off
set "textfile=C:\data.txt"
powershell -NoProfile -ExecutionPolicy Bypass -Command "gc '%textfile%'' | group {$_.Split(':',2)[1]} | ?{$_.Count -gt 1} | %%{$_.group | select -skip 1| %%{\"Duplicate in row $($_.Split(':')) with running number $($_.Substring($_.Length-4))\"}}"
Grüße Uwe
p.s. Powershell macht richtig Spaß wenn du die ersten Hürden überwunden hast. Es ist definitiv einen zweiten Blick wert, zumal sie unter Windows Betriebsystemen schon seit langem zum Standard geworden ist und erheblich Schreibarbeit und Entwicklungszeit einspart.
Hallo Mihail
Mein Beispiel sollte dich eigentlich eher davon abhalten, Batch lernen zu wollen. Mit PowerShell kommst du viel einfacher zum Ziel. Batch bietet viel weniger Möglichkeiten und darum musst du viel zu oft quer denken da es keine direkte Lösung gibt, must Aktionen vielfach ausführen (wie meine FINDSTR Aufrufe) was Zeit raubt und einiges ist einfach gar nicht erst mit Batch machbar oder so unsicher oder aufwendig, dass es einfach nicht empfehlenswert ist. Mit PowerShell hast du alle Möglichkeiten von .NET (anders gesagt, alles was du mit C# umsetzen kannst, geht grundsätzlich auch mit PowerShell).
Ich habe mich schon vor 25 Jahren unter DOS mit Batch beschäftigt. Deshalb sind die Voraussetzungen etwas anders. Keine Ahnung, wie viele Hundert Batchschnipsel ich für unterschiedliche Problemlösungen bereits gesammelt habe. Wenn ich heute noch einmal mit Scripting starten würde, wäre weder Batch, noch VBScript eine Option. PowerShell bietet einfach so überragende Möglichkeiten, dass nichts anderes infrage kommen würde...
Grüße
rubberman
Mein Beispiel sollte dich eigentlich eher davon abhalten, Batch lernen zu wollen. Mit PowerShell kommst du viel einfacher zum Ziel. Batch bietet viel weniger Möglichkeiten und darum musst du viel zu oft quer denken da es keine direkte Lösung gibt, must Aktionen vielfach ausführen (wie meine FINDSTR Aufrufe) was Zeit raubt und einiges ist einfach gar nicht erst mit Batch machbar oder so unsicher oder aufwendig, dass es einfach nicht empfehlenswert ist. Mit PowerShell hast du alle Möglichkeiten von .NET (anders gesagt, alles was du mit C# umsetzen kannst, geht grundsätzlich auch mit PowerShell).
Ich habe mich schon vor 25 Jahren unter DOS mit Batch beschäftigt. Deshalb sind die Voraussetzungen etwas anders. Keine Ahnung, wie viele Hundert Batchschnipsel ich für unterschiedliche Problemlösungen bereits gesammelt habe. Wenn ich heute noch einmal mit Scripting starten würde, wäre weder Batch, noch VBScript eine Option. PowerShell bietet einfach so überragende Möglichkeiten, dass nichts anderes infrage kommen würde...
Grüße
rubberman
Hallo Mihail

Die Ausgabe wird in eine Datei geschrieben, die so heißt wie die Eingangsdatei, aber mit angehängter Tilde. Wenn du dort die korrekte Ausgabe finden solltest, entferne die beiden Doppelpunkte vor der letzten Codezeile. Dann wird die Originaldatei ersetzt.
Grüße
rubberman
Ich hoffe, dass Du noch an meine Frage von 07.08.22016
Ich bin froh wenn ich noch weiß was gestern war @echo off &setlocal
set "txtfile=test.txt"
set "lnums="
for /f "usebackq tokens=1* delims=:" %%i in ("%txtfile%") do (
for /f %%k in ('type "%txtfile%"^|find /c ":%%j"') do if %%k gtr 1 call set "lnums=%%lnums%%%%i,"
)
set "n=0"
>"%txtfile%~" (
for /f "usebackq tokens=1* delims=:" %%i in ("%txtfile%") do (
set "check="
for %%k in (%lnums%) do if %%i==%%k set "check=1"
if not defined check (
set /a "n+=1"
for /f %%k in ('set /a n') do echo %%k:%%j
)
)
)
::move /y "%txtfile%~" "%txtfile%"
Grüße
rubberman
Hallo Mihail.
gibt direkt die Anzahl der gefundenen "String"s in der Datei als Zahl aus.
Hier mal die vereinfachte Version mit Kommentaren (REM).
Grüße
rubberman
vor allem zu so einer späteren Zeit
Was wohl der Grund ist, warum das Script noch etwas zu kompliziert geworden ist.Getestet habe ich den Script schon aber ehrlich gesagt werde ich noch eine Weile brauchen bis ich ihn verstanden habe.
Ist nicht kompliziert. Der Schlüssel ist die Option /C von FIND. Eintype "Dateiname"|find /c "String"
gibt direkt die Anzahl der gefundenen "String"s in der Datei als Zahl aus.
Hier mal die vereinfachte Version mit Kommentaren (REM).
@echo off &setlocal
REM Dateiname
set "txtfile=test.txt"
REM neue Zeilennummer
set "n=0"
REM temporäre Ausgabedatei
>"%txtfile%~" (
REM jede Zeile in Zeilennummer (%%i) und restliche Zeile hinter dem Doppelpunkt (%%j) trennen
for /f "usebackq tokens=1* delims=:" %%i in ("%txtfile%") do (
REM zählen, wie oft der Rest der Zeile (: und %%j) in der Datei vorkommt. Wenn nur einmal, dann ...
for /f %%k in ('type "%txtfile%"^|find /c ":%%j"') do if %%k==1 (
REM neue Zeilennummer um 1 erhöhen
set /a "n+=1"
REM neue Zeilennummer in %%l zwischenspeichern und zusammen mit : und dem Rest der Zeile ausgeben
for /f %%l in ('set /a n') do echo %%l:%%j
)
)
)
REM Datei durch die temporäre Datei ersetzen
move /y "%txtfile%~" "%txtfile%"
rubberman
Zitat von @rubberman:
Wäre ich so ein Genie, wäre ich in der Lage dir einen PowerShell-Einzeiler zu diesem Zweck zu schreiben. Nevermind ...
Hahaha der war gut, graue Haare hab ich zwar auch schon diverse, aber "den ultimativen Geistesblitz" nach dem Griff in die Steckdose hatte ich dann doch noch nicht Wäre ich so ein Genie, wäre ich in der Lage dir einen PowerShell-Einzeiler zu diesem Zweck zu schreiben. Nevermind ...
@Mihail Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.