kileo20
Goto Top

Batch Anzahl der Zeichen in einer Textdatei

Hallo,

bin absoluter Script Anfänger und suche in einem Fall nach einer Möglichkeit Zeichen in Textdatei zu zählen. Sollten es mehr als 10 Zeichen sein dann soll die Textdatei umbenannt werden. Die Textdateien befinden sich alle im selben Ordner.

Ich finde zwar Lösungen für die Auswertung der Zeilen in einer Textdatei (findstr) aber die beziehen sich meist auf einer einzigen Datei und auf Zeilen.

Danke vorab für alle Unterstützungen

Grüße
kileo

Content-Key: 606475

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

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: rubberman
rubberman 20.09.2020 um 21:12:03 Uhr
Goto Top
Zeichen in Textdatei zu zählen
Was sind bei dir Zeichen? Gehen wir mal von ASCII oder ANSI SBCS codierten Dateien aus, dann ist die Größe der Datei gleich der Anzahl der Zeichen.
for %%i in ("test.txt") do echo %%~zi  
Dabei ist zu beachten, dass auch Zeilenumbrüche Zeichen sind (unter Windows gleich 2 - Carriage Return und Line Feed, auf *nixoiden Systemen nur das Line Feed).

ABER: Textdateien sind nicht gleich Textdateien.
Für UTF-8 codierte Dateien gilt das nicht, da hier ein Zeichen aus bis zu 4 Bytes besteht. Ebenso wenig für UTF-16, wo ein Zeichen aus 2 oder 4 Bytes besteht. Über DBCS Codierungen oder UTF-7 rede ich lieber gar nicht erst. Worauf ich hinaus will - mit Batch lässt sich das nicht zuverlässig ermitteln. Sicher kann man ein entsprechendes Tool in einer anderen Sprache schreiben. Aber damit das einigermaßen zuverlässig funktioniert, müsste man auch einem solchen Programm die erwartete Codierung der Datei mitgeben, ebenso ob Byte Order Marks oder Zeilenumbrüche mitgezählt werden sollen usw.

Grüße
Steffen
Mitglied: Kileo20
Kileo20 20.09.2020 um 22:24:26 Uhr
Goto Top
Hi Rubberman,

Danke für deine Details.

Mit Zeichen meine ich sowohl Buchstaben und Zahlen.

Dein Vorschlag habe ich noch ausgebaut um alle .txt Dateien in einem Ordner zu prüfen:

for %%i in ("dir /b *.txt") do @set count=%%~zi

Und um dann die Datei mit mehr als 10 „Zeichen“ umschreiben zu lassen nich folgende Zeile im batch hinzugefügt:

If %count% lss 10 in (*.txt) ren „*.txt“ „*.leer.txt“

Hab auch versucht mit der FOR Schleife gleich Die txt umzubenennen wenn die „Zeichen“ weniger als 10 sein sollten indem ich die zweite Zeile IF Weggelassen haben und FOR Schleife um „do rename“ erweitert habe.

Aber leider kriege ich keine Auswertung jeder einzelner txt Datei
Mitglied: Doskias
Doskias 21.09.2020 um 10:56:55 Uhr
Goto Top
Zitat von @Kileo20:
Aber leider kriege ich keine Auswertung jeder einzelner txt Datei

du machst es ja auch falsch. Du kannst nicht einfach den Befehl nehmen und aus dem Dateinamen eine Variable machen. Mein Tipp (und ich schreibe hier bewusst nicht den Code rein, damit du was lernst ist folgenden vorgehen.

1. Frage ab, welche Textdatei im Ordner sind mittels get-childitem
2. Für jedes gefunden Item führst du nun die bereits bekannte for-Schleife aus, in Abhängigkeit zum Namen aus dem get-Child

Denkanstoß.
$files=get-chidlitem
foreach ($f in files)
{
for %%i in ($f) do echo %%~zi
}

Du musst jetzt noch das get-chilitems anpassen, damit du auch nur den Dateinamen bekommst und ggf. mit "-rename" noch das eine oder andere Steuerzeichen entfernen, aber vom Prinzip her sollte es dir weiterhelfen.
Mitglied: rubberman
Lösung rubberman 21.09.2020 um 11:54:26 Uhr
Goto Top
Hmpf… ungetestet vermutlich so:
for /f "delims=" %%i in ('dir /a-d /b *.txt') do if %%~zi lss 10 ren "%%~i" "%%~ni.leer%%~xi"  
Dass du bei einem weiteren Lauf dann auch Dateien à la foo.leer.leer.txt bekommst, sollte selbsterklärend sein. Bin mir auch nicht sicher inwiefern du verstanden hast, was ich oben geschrieben habe. %%~zi ist die Dateigröße in Bytes. Das hat ggf. nichts mit der Anzahl Zeichen zu tun und schon gleich überhaupt nichts, wenn du nur von Buchstaben und Zahlen ausgehst.

Steffen
Mitglied: 145916
145916 21.09.2020 aktualisiert um 12:07:26 Uhr
Goto Top
Nimm gleich die Powershell
ls 'd:\ordner' -File -Filter *.txt | ?{(gc $_.Fullname -raw).Count -gt 10} | rename-item -Newname {$_.Basename + "_leer" + $_.Extension}  
Kannst du auch in ne Batch pressen wenn du willst
Powershell -EP ByPass -C "ls 'd:\ordner' -File -Filter *.txt | ?{(gc $_.Fullname -raw).Count -gt 10} | rename-item -Newname {$_.Basename + '_leer' + $_.Extension}"  
Mitglied: Kileo20
Kileo20 21.09.2020 um 13:14:08 Uhr
Goto Top
Supi, Danke, werd ich gleich mal ausprobieren. Dachte mir schon dass Powershell die bessere Lösung sein könnte
Mitglied: Kileo20
Kileo20 21.09.2020 um 21:26:51 Uhr
Goto Top
PowerShell meckert über den anfang "ls":

Der Befehl "ls" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Aber die Batchlösung von Steffen funktioniert einwandfrei. Danke trotzdem für deinen Hilfe
Mitglied: Kileo20
Kileo20 21.09.2020 um 21:33:01 Uhr
Goto Top
Danke Steffen, das ist die Lösung. Ich kannte übrigens die variable %%~zi, hatte bereits einige Variablen aus ss64 und anderen Portalen recherchiert aber irgendwie den Überblick verloren face-smile
Mitglied: Kileo20
Kileo20 21.09.2020 um 21:40:03 Uhr
Goto Top
Hab ein wenig als Vollblut Powershell Anfänger experimentiert und zuletzt an diesem experimentiert gebastelt:

$files=get-chidlitem -path "LW:\ordner\"
foreach ($f in files)
{
for %%i in ($f) do echo %%~zi
}

leider ohne Erfolg.

Ich hab mich für die Batch Lösung von Steffen entschieden, das geht 100%.

Danke auch dir für dein Unterstützung!
Mitglied: 145916
145916 22.09.2020 aktualisiert um 07:13:36 Uhr
Goto Top
Zitat von @Kileo20:

PowerShell meckert über den anfang "ls":

Der Befehl "ls" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Dann ist deine Powershell zu alt, ls ist ein Alias für Get-ChildItem, du kannst aber genauso gut auch dir verwenden, ist auch nur ein Alias dafüt. Meine Befehlsreihen oben wurden natürlich vorher getestet und funktionieren einwandfrei.

Der Quark den @Doskias oben geschrieben hat wird niemals funktionieren das ist Batch gematsche in Powershell und syntaxmäßig vollkommen falsch.
Mitglied: Doskias
Doskias 22.09.2020 um 10:57:54 Uhr
Goto Top
Zitat von @145916:
Der Quark den @Doskias oben geschrieben hat wird niemals funktionieren das ist Batch gematsche in Powershell und syntaxmäßig vollkommen falsch.

Deswegen stand da auch Denkanstoß. Aber du hast recht. ich hätte deutlicher schreiben können, sollen und müssen, dass ich damit meinte, dass dort die Hauptarbeit reinkommt.