Batch Namen aus Textdatei auslesen mittels Batch

BanRi

Newbie
Registriert
Feb. 2016
Beiträge
6
Hallo zusammen,

ich bin neu hier und bräuchte etwas unterstützung beim erstellen einer Batch Datei und hoffe das mir hier geholfen wird :)

Ziel ist es mittels einer Batch Datei aus einer txt. Datei Channel Namen auszulesen und diese in einer seperaten txt. Datei
untereinander aufzuschreiben und zu speichern.
Die txt. Datei sieht z.B so aus

Code:
<BackgroundColor data="0"/> 
<DISPLAY_INFO>
<CHANNEL name="MAIN_CLOCK" color="10789024" on="1" xxxxxx
<CHANNEL name="MAIN_CLOCK_5MS" color="10788767" xxxxxx
</CHANNEL>
.....

Ausgelesen werden soll lediglich alles was mit "CHANNEL name=" anfängt,
also MAIN_CLOCK und MAIN_CLOCK_5MS.
Die hätte ich dann gerne in einer seperaten txt. Datei untereinander stehen.
Nach etwas recherche bin ich hier im Forum auf ein ähnliches thema gestoßen
https://www.computerbase.de/forum/threads/batch-wert-aus-textdatei-auslesen.1001909/
Diesen Quellcode habe ich auf mich angepasst, jedoch macht es nicht das was
ich gerne möchte.

Könntet ihr mir bitte weiterhelfen da ich aktuell nicht weiterkomme.

Code:
@echo off

findstr /r /c:"<CHANNEL name=\"..*\"" info.txt > result.txt
set line=0
set linefinal=0

if %errorlevel%==0 (
	FOR /F "tokens=2 delims=''>'" %%i in (result.txt) do set line=%%i
	)
	echo %line%
	set linefinal=%line:"=%
	echo "Gefundene Nummer: %linefinal%"
	@echo %linefinal% > final.txt

pause
 
Zwar keine Batch, aber es führen viele Wege nach Rom. ;) Schnell und schmutzig: RegEx-Beispiel gesucht, angepaßt, läuft mit Notepad++ und allem, was RegEx kann.

Folgender Ausdruck findet alle Zeilen, die nicht mit <CHANNEL name="MAIN_CLOCK" beginnen:

Code:
(^(?!<CHANNEL name="MAIN_CLOCK)[^\n]*)+

Diese werden ersetzt mit nichts, also gelöscht.

rq81KGr.png


Übrig bleiben leere Zeilen und der gewünschte Inhalt. Die leeren Zeilen löschen wir über Bearbeiten → Zeilen → Leerzeilen löschen (auch Zeilen, die nur Whitespace enthalten):

MRnlh0z.png


Voilà, fertig ist die bereinigte Textdatei.
 
Zuletzt bearbeitet:
erstmal danke für die schnelle Antwort aber ich glaube ich wurde missverstanden :)
In der txt.Datei stehen > 1000 "CHANNEL name" und ich benötige nur die Werte/ Eintragungen
die hinter den "=" eingetragen sind. Alles was danach und davor kommt benötige ich nicht.

sprich, die unbearbeitete txt. Datei sieht so aus
<BackgroundColor data="0"/>
<DISPLAY_INFO>
<CHANNEL name="MAIN_CLOCK" color="10789024" on="1" xxxxxx
<CHANNEL name="MAIN_CLOCK_5MS" color="10788767" xxxxxx
</CHANNEL>
.....

und die neue txt. Datei soll dann so aussehen
MAIN_CLOCK
MAIN_CLOCK_5MS
.....
 
Also nur die Zahlwerte, die zwischen color="" stehen?

Mal rot eingefärbt, was nach meinem Verständnis weg soll, und grün, was bleiben soll.


<BackgroundColor data="0"/>
<DISPLAY_INFO>
<CHANNEL name="
MAIN_CLOCK" color="10789024" on="1" xxxxxx
<CHANNEL name="
MAIN_CLOCK_5MS" color="10788767" xxxxxx
</CHANNEL>



Wenn das so ist und die restliche Textstruktur gleich bleibt, kannst du nach den Schritten von oben ja einfach alles drumherum suchen und wieder durch nichts ersetzen.

Den vorderen Teil finden wir mit der Suche nach

Code:
 <CHANNEL name="

und ersetzen ihn mit nichts.

o4UDF96.png


Für den hinteren Teil brauchen wir eine RegEx mit Platzhalter, weil die Zeichen bis zum Zeilenvorschub variieren. Deshalb suchen wir nach

Code:
" color="(.*?)\n

und ersetzen es mit dem Zeilenvorschub

Code:
\n

cE6icwX.png


Ding! :D

Das (LF) im Screenshot ist nur das eingeblendete Steuerzeichen für den Zeilenvorschub, LineFeed, und taucht nicht im eigentlichen Text auf.
 
Zuletzt bearbeitet:
habe dies mal eben nachgespielt, grundsätzlich funktioniert es wie du es beschrieben hast.
Jedoch bleiben alle Zeilen stehen wo nicht "CHANNEL name=" davor steht :( somit kann ich diesen weg nicht nutzen.
Des Weiteren muss es auch ohne Notepad++ machbar sein, da dies nicht jeder auf seinen rechner installiert hat,
daher wäre ich über eine batch Lösung schon sehr glücklich. Trotzdem vielen Dank
 
Hast du die Schritte aus dem oberen Beitrag vorher auch ausgeführt? Die sind Vorbedingung, um die Zeilen ohne "CHANNEL name=" zu entfernen. Daß es nicht funktionieren kann, wenn es von deinem Beispielschema aus dem Startbeitrag abweicht, ist klar. Du mußt aber schon angeben, wann wo welcher Ausdruck variieren kann, sonst kann man keine Batch und keine RegEx dafür schreiben. :/ Kannst du die .txt irgendwo hochladen, oder enthält die sensible Informationen?
 
Hi,

zum Großteil hier abgeguckt:
Code:
@echo off
if exist output.txt del output.txt

FOR /F "delims=" %%x IN ('findstr /B /C:"<CHANNEL name" input.txt') DO (
  set V=%%x
  call set V=%%V:"=µ%%
  FOR /F "tokens=2 delims=µ" %%G IN (
   'call echo.%%V%%'
  ) DO ECHO %%G)>>output.txt
)
 
Servus,

wenn man von deinem Beispiel ausgeht, habe ich folgende Ausgangsdatei 1.txt verwendet:

Code:
<BackgroundColor data="0"/> 
<DISPLAY_INFO>
<CHANNEL name="MAIN_CLOCK" color="10789024" on="1" xxxxxx
<CHANNEL name="MAIN_CLOCK_5MS" color="10788767" xxxxxx
</CHANNEL>

und habe dazu ein Quick-and-Dirty PowerShell Script geschrieben

Code:
$quelle = "C:\1.txt"
$ziel = "C:\2.txt"
$data = Get-Content $quelle
foreach($line in $data)
{
	if($line -like "<CHANNEL name=*")
	{
	$line = $line.Remove(0,15)
	$line = $line.Split('"')
	$line[0] | Tee-Object -FilePath $ziel -Append
	}
}

Die Ausgabe in 2.txt war dann wie folgt:

Code:
MAIN_CLOCK
MAIN_CLOCK_5MS
 
@DeusoftheWired
den oberen teil habe ich dabei natürlich nicht beachtet :baby_alt:
somit funktioniert es natürlich :daumen:
Und wie erstellt man damit jetzt eine Batch oder RegEx?
ist leider neuland für mich ...

@simpsonfan
danke für deine unterstützung, funktioniert jedoch leider nicht :(
Unbenannt.png
 
Welches OS verwendest du denn? Eigentlich steht doch gar nirgends ein einzelnes "<". Kann den Fehler hier nicht nachvollziehen. Tritt der Fehler auch auf, wenn du nur die im ersten Post genannten Beispieldaten als input.txt verwendest?
Mach doch mal echo an und poste dann die Ausgabe mit den Beispieldaten.

Oder du verwendest lurids Powershell-Skript. Wobei das unter einem alten Powershell2.0 (XP, Vista) wegen dem "-Append" noch nicht läuft. Das sollte aber vermutlich ja egal sein.
 
Ich verwende Windows 7. Ich habe das ganze jetzt mit den Beispieldaten nachgemacht und ja da funktioniert es!
Mit der kompletten txt. Datei (die ich hier leider nicht online stellen kann) funktioniert es nicht :(
Wobei ich in der txt. Datei aber auch kein einzelnes "<" gefunden habe.
Sonst ist es eigentlich genau das was ich gern möchte.
Jedoch kann ich den Code den du bereit gestellt hast nicht ganz nachvollziehen,
daher hoffe ich weiterhin auf deine Unterstützung.
 
Probiers mal mit meinem Code. Als .ps1 speichern und ausführen.
Aber vorher bitte Quelle und Ziel anpassen :-)
 
Das Problem bei der Sache ist, dass Batch (bzw. FOR) mit bestimmten Zeichen nicht gut klarkommt. So z.B. mit dem Anführungszeichen. Um zwischen den Anführungszeichen zu trennen, habe ich mich des Code-Schnipsels auf der oben verlinkten Seite bedient, ohne ihn mir selbst genauer anzuschauen.
Dazu habe ich grade auch keine Lust, aber hier wäre noch eine andere Alternative:
Code:
if exist output.txt del output.txt

FOR /F "tokens=3 delims=^= " %%x IN ('findstr /B /C:"<CHANNEL name" input.txt') DO (
  ECHO %%~x>>output.txt
)
Das trennt den gefundenen String bei Gleichheitszeichen oder Leerzeichen und nimmt dann die dritte Spalte davon. Durch die Tilde bei %%~x werden noch die Anführungszeichen entfernt, da die durch das Trennen bei Gleich- und Leerzeichen mit verarbeitet werden.
Vielleicht klappt ja das.

Edit: Also auf das Beispiel läuft dein Code problemlos, lurid. Er müsste nur wahrscheinlich vor dem Ausführen noch die Berechtigung für Skripte in Powershell setzten. (@TE Dazu Powershell als Admin starten und Set-ExecutionPolicy Unrestricted eintippen.)
 
Zuletzt bearbeitet:
Mea Culpa. Da hast du natürlich völlig recht :-)
 
Hallo zusammen,

@lurid
habe dies zuhause getestet und funktioniert natürlich auch super :daumen:
leider hat nicht jeder auf seinen rechner admin rechte weshalb das ganze wieder zu kompliziert wird.

@simpsonfan
großes dankeschön für deine Hilfe :schluck: damit funktioniert es wie gewünscht!
 
Zurück
Oben