alfabravo
Goto Top

Batch: Zeilen in mehreren .txt zählen und Summe in Variable speichern

Hallo & guten Tag!

Ich möchte gerne die Zeilen mehrerer Textdateien zählen und die Summe in einer Variablen speichern.

Für das Zeilenzählen in einer einzelnen Datei benutze ich immer

for /f "delims=:" %%A in ('findstr /OFF /N .* "Datei.txt"') do set Zeilen=%%A  

Wie aber funktioniert das Zählen (und Summieren) der Zeilen über mehrere Dateien hinweg?

Die Anzahl der Dateien, deren Zeilen gezählt und summiert werden sollen, kann unterschiedlich ausfallen.
Der Dateiname ist aber immer nach dem Schema

Datei*.txt

aufgebaut,

also z. B.

Datei1.txt
Datei2.txt
Datei3.txt
...

Hat jemand eine Idee?

Content-ID: 295028

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

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

Friemler
Lösung Friemler 03.02.2016 aktualisiert um 20:57:39 Uhr
Goto Top
Hallo alfabravo,

teste mal folgendes:
@echo off & setlocal enabledelayedexpansion

set "FileMask=*.txt"  

set /a TotalLines=0
set /a LastFileLines=0
set "LastFileName="  

for /f "tokens=1,2 delims=:" %%a in ('findstr /rn "^" "%FileMask%" 2^>NUL') do (  
  if defined LastFileName if "%%a" neq "!LastFileName!" (  
    set /a TotalLines+=LastFileLines
  )
  
  set "LastFileName=%%a"  
  set /a LastFileLines=%%b
)

set /a TotalLines+=LastFileLines

echo Gesamte Zeilenzahl: %TotalLines%

Falls Du in Zeile 3 als Wert für FileMask einen vollständigen Pfad mit Laufwerksbuchstaben angibst, gibt FINDSTR auch den vollständigen Pfad für jede Datei aus. Da dieser auch einen Doppelpunkt enthält, musst Du dann in Zeile 9 tokens=1,2 durch tokens=2,3 ersetzen.

[EDIT]
Man könnte auch find /c /v "xyz" "*.txt" zur Ausgabe der Zeilenanzahl der Dateien benutzen, allerdings muss dann der Suchstring xyz durch etwas ersetzt werden, was in den Dateien garantiert nicht vorkommt.
[/EDIT]

Gruß
Friemler
114757
114757 03.02.2016 aktualisiert um 18:11:29 Uhr
Goto Top
Oder man nimmt gleich die Powershell, dann reicht ein:
(gc 'C:\Ordner\*.txt').Count
face-smile
Gruß jodel32
rubberman
Lösung rubberman 03.02.2016 aktualisiert um 20:57:45 Uhr
Goto Top
Hallo.
was in den Dateien garantiert nicht vorkommt.
Yepp. Der Trick ist "".

@echo off &setlocal
set /a n=0
for %%i in ("Datei*.txt") do for /f %%j in ('type "%%~i"^|find /c /v ""') do set /a n += %%j  
echo %n%
pause

Grüße
rubberman
alfabravo
alfabravo 03.02.2016 um 21:00:27 Uhr
Goto Top
Wow, funktioniert! Danke Euch allen für Eure Zeit und die Codes! Große Klasse!
Friemler
Friemler 03.02.2016 um 21:07:56 Uhr
Goto Top
Hallo rubberman,

mit diesem Trick gehen einem aber die Leerzeilen durch die Lappen. Wenn die nicht mitgezählt werden sollen kann man das so verwenden, ansonsten nicht.

Gruß
Friemler
rubberman
rubberman 03.02.2016 um 21:55:49 Uhr
Goto Top
Hey Friemler.

mit diesem Trick gehen einem aber die Leerzeilen durch die Lappen
Nein, grundsätzlich werden Leerzeilen mitgezählt. Lediglich bei der letzten Zeile wird nicht unterschieden, ob sie mit einem Zeilenumbruch abgeschlossen wurde oder nicht.

Grüße
rubberman
Friemler
Friemler 03.02.2016 um 22:55:04 Uhr
Goto Top
Hallo rubberman,

hast recht, find /c /v "" findet tatsächlich auch Leerzeilen, Cr+Lf zählen eben auch als Zeileninhalt. Hätte ich doch vorher mal testen sollen...

Gruß
Friemler