Supportnet Computer
Planet of Tech

Supportnet / Forum / BS-Sonstige

Textdatei auslesen...???





Frage

Hallo, ich bin nicht gerade ein Profi was Batch Programmierung angeht! Ich würde gerne folgendes realisieren: c:\eigene Dateien\|Sicherung Eigene Dateien|User1 c:\win95|Sicherung Systemfiles|User2 ... ... aus dieser Textdatei mit evtl. mehr Zeilen sollen nacheinander die 3 Segmente, getrennt durch dieses Zeichen "|", jeweils einer Variable zugeordnet werden. Das Dateiende der Textdatei soll mit ":END" gekennzeichnet werden. Ist das ohne weiteres mögich? Danke schonmal im voraus... MFG kinglazee P.S. Super Forum in sachen DOS, hab beim letzten prob sofort Hilfe bekommen und es ging auch alles sofort! LOB!

Antwort 1 von manei

Hallo,

es ist fast alles möglich.

Nur dieses Zeichen " | " ist ein interner fest verankerter DOS- bzw. Batchbefehl, der evtl. bei der Abfrage aktiviert werden und eine Fehlermeldung verursachen könnte. Ich würde vorschlagen, dafür ein anderes Zeichen zu nehmen (evtl. ~ ).

Habe ich Dich richtig verstanden, Du hast in einer Textdatei wie o.a. eine oder mehrere Zeilen stehen. Jede Zeile soll ausgelesen, nach den genannten Kriterien getrennt und danach verarbeitet werden. Danach kommt die nächste Zeile dran usw. bis alle Zeilen ausgelesen sind.

Dateiende ist nomalerweise das EoF (EndofFile als unsichtbares, von der Textverarbeitung aber lesbares Zeichen definiert). Wo oder was also bitte soll mit End gekennzeichnet werden.

Das allerwichtigste nun aber zum Schluß:

Welches Betriebsystem hast Du????

Hast Du Win9X(95/98/ME) oder WinNT/2000/XP.
Für Dein Problem sind das ganz unterschiedliche Vorgehensweisen bei der Lösung/Programmgestaltung.

MfG maneich



Antwort 2 von kinglazee

erstmal danke für die Hilfe...

okay, mit einem Sinus Zeichen (~) käme ich auch zurecht. Die kriterien hast du genau richtig aufgefasst und beschrieben, mein Betriebssystem basiert auf NT Basis und ist WinXP.

Das Dateiende als EoF wäre auch okay, mit der Zeile ":END" wollte ich nur erreichen dass man ohne zeilen zu löschen einfach mal zwischen den schon vorhanden Zeilen einfach dieses ":END" einfügt und damit den ablauf der weiteren verarbeitung der Textdatei abbricht! So kann ich ohne weiteres mal ein paar Zeilen übergehen ohne sie aus der Datei konkret zu löschen. Wäre aber wie schon gesagt nicht tragisch wenn ich über das EoF arbeiten würde!

Hast du dazu eine gute lösung?
Danke im vorraus...

MFG kinglazee


Antwort 3 von manei

Hallo,

so einfach wie Du dir das vorstellst ist das alles nicht.

Du kannst in einer Datei nicht so einfach Zeilen dazwischen löschen.

Genau so kannst Du nicht so einfach mal ein End oder EOF zwischen die Zeilen setzen.

Z.B. Deine Datei nennt sich "test.txt", dann kannst Du mit

for /f "tokens=1,2,3 delims=~" %%i in (test.txt) do call :ablauf %%i %%j %%k
goto :eof

Damit hast du Deine 3 Blöcke getrennt und mußt jetzt in ablauf bestimmen, was damit gemacht werden soll. In ablauf werden %%i %%j %%k zu %1 %2 %3.

:ablauf
Hier kannst du nun bestimmen was mit %1 %2 %3 passieren soll.



Damit werden alle Zeilen dieser Datei abgearbeitet. Wenn du nun nur einige Zeilen dieser Datei abarbeiten willst, gibt es in der Zeile for /f die Möglichkeit mit ship x(ZeilenNr,) zu dieser Zeile zu springen und oder Rest abzuarbeiten und/oder mit z.B end~end~end nach der letzen Zeile die verarbeitet werden soll zu bestimmen welche Zeile die letzte sein soll.
Dann fragst Du in :ablauf als erstes ab ob ende ist mit
if %1==end exit

Wenn Du Dein Problem nicht genauer beschreibst, kann Dir auch keiner eine genauere Erklärung dazu geben.

MfG maneich

Antwort 4 von kinglazee

Also ich habe das mal gerade getestet, ich erreiche momentan eigentlich recht wenig damit.

Ich will als Test einfach mal nur die einzelnen Paramter %1 %2 %3 über den Befehl ECHO anzeigen lassen, und dazu wäre noch ganz gut die Zeilennummer %4 (Variablen können auch anders heißen; Spalte1-3, ZeilenNR)

den rest werde ich dann von alleine hinbekommen.

Soll als Test Dienen da ich damit noch weitere andere Dinge vorhabe.

Meine Textdatei sieht jetzt so aus:

c:\eigene Dateien\~Sicherung Eigene Dateien~User1
c:\win95~Sicherung Systemfiles~User2

Bin für jede weitere Hilfe sehr Dankbar!

MFG kinglazee

Antwort 5 von kinglazee

also, mittlerweile hab ich noch ein bischen mehr rumgespielt, habe es hinbekommen... Danke!

Aber der Part mit dem Anspringen einzelner Zeilen bekomm ich nicht so richtig hin.
Wie funktioniert das wenn ich jetzt einfach in der Textdatei die 2. Zeile auslesen will und die einzelnen Blöcke wieder mit ECHO anzeigen lassen will, die Zeilennummer sollte nach möglichkeit eine Variable sein.

Die Zeilennummer werde ich nachher abbfragen mit WBAT.com und bekomme die Zeilennummer in Form von einer Variable.

Kannst du mir da noch weiter Helfen?
Wäre sehr dankbar!

MFG kinglazee

Antwort 6 von manei

Hallo,

mit skip=1 in Deinem Fall überspringst Du die erste Zeile. Dies baust du in der for-Zeile mit ein. Es wird also immer die Anzahl der Zeilen, die übersprungen werden sollen, angegeben.

Die Zeilen-Nr. könnte man über die zu überspringende(n) Zeile(n) definieren mit

set /a x1=1
for /f "tokens=1,2,3 delims=~ skip=%x1%" %%i in (test.txt) do call :ablauf %%i %%j %%k
goto :eof

:ablauf
set /a x1=%x1%+1
echo %x1% %1
echo %x1% %2
echo %x1% %3
pause

Eine Ziffer oder Zahl allein kann keine Variable sein. Du könntest das aber zusammen mit enem Buchstaben machen, z.B. a2 also mit a%x1%.

Hast du noch weitere Zeilen in der Datei, werden diese, außer der ersten Zeile in diesem Fall, natürlich auch abgearbeitet. Das kannst du lösen, indem Du in :ablauf bei nur einer Zeile als letze Zeile exit oder bei mehreren Zeilen über einen Zähler z.B. %x1% if %x1%==2 exit einträgst.

MfG maneich

Antwort 7 von kinglazee

danke für die Hilfe...

Mit der ersten von dir geposteten Anweisung hab ich noch en kleines Prob, in der Textdatei sind werden Pfade verwendet die Leerzeichen enthalten, sobald eines irgendwo in der Zeile ist, dann sieht er es als einzelnen Block.
Bekommt man das so hin dass die Leerzeichen wie ganz normaler Text gehandhabt werden?

MFG kinglazee

Antwort 8 von manei

Hallo,

wenn Du das Anführungszeichen direkt ohne Leerzeichen hinter ~ setzt, sollte das eigentlich nicht passieren.

for /f "tokens=1,2,3 delims=~" %%i in (test.txt) do call :ablauf %%i %%j %%k

bzw.
hier habe ich mal delims=~ nach ganz hinten gesetzt.

for /f "tokens=1,2,3 skip=%x1% delims=~" %%i in (test.txt) do call :ablauf %%i %%j %%k

Durch delims=~" werden normalerweiser die Standardtrennzeichen Leerzeichen und Tab ersetzt durch ~.

MfG maneich


Antwort 9 von kinglazee

Zitat:
Durch delims=~" werden normalerweiser die Standardtrennzeichen Leerzeichen und Tab ersetzt durch ~.

Also ich glaube das ist genau das Problem, der ersetzt meine Leerzeichen durch ~. Dann sieht er es als getrennter Block an und die Pfadangabe ist nicht korrekt.

Gibt es das eine andere möglichkeit?
MFG kinglazee

Antwort 10 von manei

Hallo,

in Deinem Fall sieht es so aus, als ob außer der Tilde ~ auch noch das Leerzeichen als Trennzeichen Gültigkeit hat. Das kannst du ja mal testen mit

for /f "tokens=1,2,3,4,5 delims=~" %%i in (test.txt) do echo %%i %%j %%k %%l %%m.

Das sollte nicht sein. Da muß ich mich erst mal etwas schlauer machen. Vielleicht fällt hier im Forum auch noch jemand anderem etwas dazu ein.

MfG maneich




Antwort 11 von kinglazee

ja, genauso wie du es Beschrieben hast ist mein Problem.

Das Leerzeichen wird def. als Trennzeichen gezählt. Das soll nicht so sein, die Variable mit der Pfadangabe sollte nachher den kompletten Pfad enthalten, ob mit oder ohne Leerzeichen.

Danke für die mühe...

MFG kinglazee

Antwort 12 von manei

Hallo,

eines verstehe ich nicht ganz.

Den gesamten Pfad hast Du doch immer in einer Zeile. Ohne den Einbau der Tilde sollte das doch dann so aussehen

c:\eigene Dateien\Sicherung Eigene Dateien\User1
c:\win95\Sicherung Systemfiles\User2

Wenn Du am Ende den gesamten Pfad haben willst, kannst du den doch Zeile für Zeile aus der textdatei auslesen mit

for /f %%i in (text.txt) do call :ablauf %%i
oder
for /f "skip=1" %%i in (text.txt) do call :ablauf %%i
oder Du kommentierst die Zeilen die nicht verarbeitet werden sollen mit enem Semikolon am Anfang aus z.B.
; c:\eigene Dateien\Sicherung Eigene Dateien\User1
c:\win95\Sicherung Systemfiles\User2

die Befehlszeile sieht dann so aus

for /f "eol=;" %%i in (text.txt) do call :ablauf %%i

hier werden dann nur die Zeilen ohne das Semikolon ausgelesen bzw. verarbeitet.

In :ablauf stehen die Daten/Pfad in %1 und können weiterverarbeitet werden.

Ich denke, das ist die einfachste Lösung.

zu dem Problem mit den Leerzeichen habe ich nichts gefunden. Vielleicht solltest Du Deine Zeile mit for... mal hier reinstellen, möglicherweise ist diese fehlerhaft.

Ach ja noch etwas die Variablen in der for-Zeile werden nur in batch/cmd-Dateien mit %% angegeben, testest Du das über die CMD.EXE direkt muß nur ein %-Zeichen angegeben werden.

MfG maneich



Antwort 13 von kinglazee

manei:
Zitat (kinglazee):
Meine Textdatei sieht jetzt so aus:

c:\eigene Dateien\~Sicherung Eigene Dateien~User1
c:\win95~Sicherung Systemfiles~User2
/Zitat end

Die Tildes trennen einzelne Blöcke voneinander ab, in diesen Blöcken sind unter Umständen Leerzeichen dabei!

Am ende will ich 3 Variablen haben die die Werte der 3 Blöcke enthalten.

Bei dem ganzen Projekt geht es 1. um den Lerneffekt, 2. um ein gutes System für Backup's!

Gibt es sonstige Verständnisprobleme?
MFG kinglazee

Antwort 14 von manei

Hallo,

eigentlich war die Darstellung der for-Zeile gefragt.

Als letzte vorstellbare Möglichkeit bliebe nur noch, daß von den 2 Standardtrennzeichen durch die Tilde nur 1 Standardtrennzeichen - in Deinem Fall Tab - ersetzt wird.

Um dies zu testen, solltest Du mal noch ein zweites Zeichen einfügen, das niemals in deiner Textdatei vorkommen kann z.B. #. Deine for-Zeile sieht dann z.B. so aus:

for /f "tokens=1,2,3 skip=%x1% delims=~#" %%i in (test.txt) do call :ablauf %%i %%j %%k

MfG maneich


Antwort 15 von kinglazee

Das ist eine Gute idee...

Hier mal meine Batch:

@echo off
for /f "tokens=1,2,3 delims=~" %%i in (test.txt) do call :ablauf %%i %%j %%k
goto :eof


:ablauf
echo 1.Spalte: %1
echo 2.Spalte: %2
echo 3.Spalte: %3

und hier noch die Textzeile:

C:\Dokumente#und#Einstellungen\--pL4tOOn--\Eigene#Dateien~Sicherung~h:\sicherung\temp.bkf

------------

Jetzt müsste ich nur noch hinbekommen dass die Variablen %1 %2 %3 jeweils das '#'-Zeichen durch ein Leerzeichen ersetzen...
Wenn mir das noch jemand sagen kann bin ich mehr als zufrieden!

Danke im voraus...
MFG kinglazee

Antwort 16 von manei

Hallo,

so war das eigentlich nicht gemeint.

In der Textdatei sollten die Leerzeichen schon bleiben, Du solltest nur bei delims=~# dieses Zeichen noch hinzufügen und testen ob damit auch die Leerzeichen als Trennzeichen weg sind.

Wenn das nicht hinhaut, kannst du dieses Zeichen auch ersetzen durch

echo %%1:#= % (Leerzeichen nach = und vor %)
evtl. akzeptiert er es bei %1 nicht dann

set x=%1
echo %x:#= %

Das kannst du dann auch in eine Variable setzen.

MfG maneich


Antwort 17 von kinglazee

Super, funktioniert soweit sehr gut.
Das einzigste was ich noch bräuchte wäre folgendes:
In der Textdatei muss ich momentan dort wo normal ein Leerzeichen ist ein '#' Zeichen machen.
Würde gerne die Textdatei ohne # Zeichen schreiben und eine komplette Zeile einlesen und alle Leerzeichen durch # ersetzen...

MFG kinglazee
P.S. Sehr gutes Forum! Bekomme sehr schnell Hilfe und auch sehr Professionell!
DANKE!

Antwort 18 von manei

Hallo,

for /f %%i in (test.txt) do call :ablauf %%i

:ablauf
set x=%%1: =#%
for /f "tokens=1,2,3 delims=~" %%i in ("%x%") do call :ablauf1 %%i %%j %%k

:ablauf1
echo %%1:#= %
echo %%2:#= %
echo %%3:#= %

MfG maneich

Antwort 19 von kinglazee

hallo,

mit der Zeile:
for /f %%i in (test.txt) do call :ablauf %%i

funktioniert es nicht so richtig, er liefert mit zwar den anfang der Zeile, aber leider auch nur bis zum 1. Leerzeichen.

Ne Batch zum Testen:
@echo off
for /f %%i in (backup.txt) do call :ablauf %%i

:ablauf
set x=%1
echo Test: %x%

Gibt es keine Funktion mit der ich einfach die komplette Zeile in eine Variabl laden kann?

mfg kinglazee

Antwort 20 von Massaraksch

Deine "Batch zum Testen" müßte so gehen:

@echo off
for /f "tokens=*" %%i in (backup.txt) do call :ablauf %%i

:ablauf
set x=%*
echo Test: %x%

Dann klappt's auch mit kompletten Zeilen.

Massaraksch

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: