Verwendung von Tabs in den DELIMS von FOR-Schleifen
Excel-Tabellen als TXT-Datei speichern und anschließend mit einer FOR-Schleife die Tabs entfernen (TXT-Datei komprimieren)
Gegeben ist die Datei "g.txt", die aus Excel gespeichert worden ist.
Der Inhalt sieht so aus:
Feld1<TAB>Feld2<TAB>Feld3
for /F "delims=<TAB> tokens=1-3" %%a in (g.txt) do echo "%%a%%b%%c >> b.txt
Das Ergebnis für "b.txt" muss so aussehen:
Feld1Feld2Feld3
Leider sieht es so aus:
F%b%c
Warum?
Kritisch ist der Tab als Delimeter, der weder ausgeschrieben als "<TAB>" noch als " " akzeptiert wird.
Das Weglassen des delims ist nicht möglich, da die Felder Leerzeichen beinhalten dürfen.
Gegeben ist die Datei "g.txt", die aus Excel gespeichert worden ist.
Der Inhalt sieht so aus:
Feld1<TAB>Feld2<TAB>Feld3
for /F "delims=<TAB> tokens=1-3" %%a in (g.txt) do echo "%%a%%b%%c >> b.txt
Das Ergebnis für "b.txt" muss so aussehen:
Feld1Feld2Feld3
Leider sieht es so aus:
F%b%c
Warum?
Kritisch ist der Tab als Delimeter, der weder ausgeschrieben als "<TAB>" noch als " " akzeptiert wird.
Das Weglassen des delims ist nicht möglich, da die Felder Leerzeichen beinhalten dürfen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 64355
Url: https://administrator.de/contentid/64355
Ausgedruckt am: 26.11.2024 um 14:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo nostrakis!
Wenn Du dafür sorgst, dass ein "echtes" Tabzeichen als Delimiter verwendet wird, sollte es auch per Batch klappen. (Dass es natürlich viel sinnvoller wäre, beim Excel-Export eine "csv"-Datei zu erzeugen, muss ich wohl eigentlich nicht erwähnen ...)
Soferne Du einen Editor verwendest, der das nach "delims=" enthaltene <TAB> nicht in 4 oder 8 Leerzeichen umwandelt, sollte die folgende Schreibweise funktionieren:
Grüße
bastla
Wenn Du dafür sorgst, dass ein "echtes" Tabzeichen als Delimiter verwendet wird, sollte es auch per Batch klappen. (Dass es natürlich viel sinnvoller wäre, beim Excel-Export eine "csv"-Datei zu erzeugen, muss ich wohl eigentlich nicht erwähnen ...)
Soferne Du einen Editor verwendest, der das nach "delims=" enthaltene <TAB> nicht in 4 oder 8 Leerzeichen umwandelt, sollte die folgende Schreibweise funktionieren:
for /F "tokens=1-3 delims= " %%a in (g.txt) do echo "%%a%%b%%c >> b.txt
Grüße
bastla
Hallo nostrakis!
Dazu (dem/den Anführungszeichen, wie ich ganz unprosaisch dazu sage) vielleicht noch folgende Anmerkung: Falls einmal in der Datei Felder zwar durch Tabs getrennt, aber in Anführungszeichen eigeschlossen stehen, wärst Du mit der folgenden Schreibweise auf der sicher(er)en Seite:
Grüße
bastla
Ich hab außerdem ein Gänsefüßchen in der ECHO-Anweisung vergessen.
... was sich allerdings nicht auf die Aufteilung ausgewirkt hat (und mir daher nicht aufgefallen war).Dazu (dem/den Anführungszeichen, wie ich ganz unprosaisch dazu sage) vielleicht noch folgende Anmerkung: Falls einmal in der Datei Felder zwar durch Tabs getrennt, aber in Anführungszeichen eigeschlossen stehen, wärst Du mit der folgenden Schreibweise auf der sicher(er)en Seite:
for /F "tokens=1-3 delims= " %%a in (g.txt) do echo "%%~a%%~b%%~c">>b.txt
Grüße
bastla
Hallo nostrakis!
Die Tilde war, wie erwähnt, für den Fall gedacht, dass einmal Felder unter Anführungszeichen stünden (und wenn das - derzeit - nicht der Fall ist, schadet sie zumindest auch nicht).
Auch wenn nur 2 Felder in einer Eingabezeile stünden (und konsequenter Weise dahinter noch ein Tab), wäre das Ergebnis einfach, dass %%c keinen Inhalt hätte.
Bei meinen Tests unter Verwendung von
mit folgender "g.txt" (beachte die eingestreuten zusätzlichen Tabs ab der 2. Zeile):
erhalte ich folgende "b.txt":
Zu beachten ist eigentlich nur, dass Tabs am Beginn einer Zeile ignoriert und mehrere aufeinander folgende Tabs nur als ein Delimiter interpretiert werden - ausgegeben wird aber trotzdem kein Tab. Dies lässt sich auch einfach nachvollziehen, wenn die Tabs zb durch ";" (natürlich auch als Delimiter in der "for"-Schleife) ersetzt werden.
Grüße
bastla
Die Tilde war, wie erwähnt, für den Fall gedacht, dass einmal Felder unter Anführungszeichen stünden (und wenn das - derzeit - nicht der Fall ist, schadet sie zumindest auch nicht).
Der Ausdruck schließt aber vor dem Anführungszeichen mit einem DELIM ab: "Feld1Feld2 "
Am Ende steht ein Tab.
Wenn Du damit eine Zeile der Ausgabe beschreibst, kann ich das nicht nachvollziehen. Delimiter werden bei der Zerlegung mit "for" nicht weitergegeben, also woher sollte der Tab kommen?Am Ende steht ein Tab.
Auch wenn nur 2 Felder in einer Eingabezeile stünden (und konsequenter Weise dahinter noch ein Tab), wäre das Ergebnis einfach, dass %%c keinen Inhalt hätte.
Bei meinen Tests unter Verwendung von
for /F "tokens=1-3 delims= " %%a in (g.txt) do echo "%%~a%%~b%%~c">>b.txt
Feld1 Feld 2 Feld Nr. 3 Feld 4
"Feld5" "Feld Nr. 6"
Feld 7 "Feld Nr. 8"
Feld 9 Feld10 Feld 11 "Feld Nr. 12"
Feld 13 "Feld Nr. 14" Feld15 "Feld16"
"Feld1Feld 2Feld Nr. 3"
"Feld5Feld Nr. 6"
"Feld 7Feld Nr. 8"
"Feld 9Feld10Feld 11"
"Feld 13Feld Nr. 14Feld15"
Grüße
bastla
Hallo nostrakis!
So wie Deine Batchzeile bei mir ankommt, stehen nach "delims=" 4 Leerzeichen, anstelle eines einzelnen ASCII-Zeichens Code 9 = Tab, und zwischen %%a und %%b und %%c jeweils ein weiteres Leerzeichen. Außerdem wird auch das Leerzeichen vor >> ausgegeben (nach dem schließenden Anführungszeichen).
Auch beim Ergebnis sehe ich nach Feld3 nur zwei Leerzeichen (was allerdings nachvollziehbar ist, da mangels eines Leerzeichens die gesamte Zeile als %%a eingelesen und wieder ausgegeben wird und da es kein %%b und %%c gibt, werden nur die Leerzeichen zwischen %%a und %%b sowie zwischen %%b und %%c geschrieben) ...
Benutze bitte daher zum Posten von Textdateien und natürlich besonders Code < code> und < /code> (ohne Leerstellen)!
Welchen Editor verwendest Du übrigens?
Grüße
bastla
So wie Deine Batchzeile bei mir ankommt, stehen nach "delims=" 4 Leerzeichen, anstelle eines einzelnen ASCII-Zeichens Code 9 = Tab, und zwischen %%a und %%b und %%c jeweils ein weiteres Leerzeichen. Außerdem wird auch das Leerzeichen vor >> ausgegeben (nach dem schließenden Anführungszeichen).
Auch beim Ergebnis sehe ich nach Feld3 nur zwei Leerzeichen (was allerdings nachvollziehbar ist, da mangels eines Leerzeichens die gesamte Zeile als %%a eingelesen und wieder ausgegeben wird und da es kein %%b und %%c gibt, werden nur die Leerzeichen zwischen %%a und %%b sowie zwischen %%b und %%c geschrieben) ...
Benutze bitte daher zum Posten von Textdateien und natürlich besonders Code < code> und < /code> (ohne Leerstellen)!
Welchen Editor verwendest Du übrigens?
Grüße
bastla