Mit einer Batch eine Excel Tabelle auslesen.
Hallo,
ich hab schon wieder die nächste Frage zu einer Batch. Ist es möglich bestimmte bereiche aus einer Excel Tabelle mittels batch auszulesen? Also nur zur Info für euch. Ich habe eine Excel Tabelle( es sind immer verschiedene aber der Aufbau an sich ist immer gleich). Will dort einige Daten auslesen die ich dann weiter verarbeiten kann.
Vielen Dank im Voraus.
ich hab schon wieder die nächste Frage zu einer Batch. Ist es möglich bestimmte bereiche aus einer Excel Tabelle mittels batch auszulesen? Also nur zur Info für euch. Ich habe eine Excel Tabelle( es sind immer verschiedene aber der Aufbau an sich ist immer gleich). Will dort einige Daten auslesen die ich dann weiter verarbeiten kann.
Vielen Dank im Voraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 32784
Url: https://administrator.de/forum/mit-einer-batch-eine-excel-tabelle-auslesen-32784.html
Ausgedruckt am: 23.12.2024 um 03:12 Uhr
16 Kommentare
Neuester Kommentar
Hi,
dann musst Du schon sagen, wie zu auf die einzelnen Bereiche zugreifen willst.
Suchen nach Stichwörtern. In Zeile oder Spalte gehen?
Sag mal wie Du es Dir vorstellst.
Als Beispiel:
Für eine Tabelle mit 7 Spalten getrennt durch Semikolons (Auswertung ab der 2 Zeile)
Der Inhalt der ersten Spalte wird ausgelesen.
[EDIT: Ed geht auch
for /f "skip=2 tokens=1-7 delims=;" %%a in (p.csv) do echo %%a >> excel.txt
Nur für die erste Spalte
for /f "skip=2 tokens=1 delims=;" %%a in (p.csv) do echo %%a >> excel.txt
]
Gruß Miguel
dann musst Du schon sagen, wie zu auf die einzelnen Bereiche zugreifen willst.
Suchen nach Stichwörtern. In Zeile oder Spalte gehen?
Sag mal wie Du es Dir vorstellst.
Als Beispiel:
Für eine Tabelle mit 7 Spalten getrennt durch Semikolons (Auswertung ab der 2 Zeile)
for /f "skip=2 tokens=1,2,3,4,5,6,7 delims=;" %%a in (p.csv) do echo %%a >> excel.txt
Der Inhalt der ersten Spalte wird ausgelesen.
[EDIT: Ed geht auch
for /f "skip=2 tokens=1-7 delims=;" %%a in (p.csv) do echo %%a >> excel.txt
Nur für die erste Spalte
for /f "skip=2 tokens=1 delims=;" %%a in (p.csv) do echo %%a >> excel.txt
]
Gruß Miguel
Hi,
jetzt hab ich glaub ich gerafft. Wenn Du nachdem die 3er Gruppen ausgewertet wurden (gehören ja zusammen). Soll eine Aktion durchgeführt werden, dann auslesen der nächsten Dreiergruppen bis zum Ende ?
REM Achtung erste Zeile wird nicht ausgelesen, dort können die Tabelleninfos stehen
set /A "skip=1"
:main
set /A "zahl=0"
REM Beginn der für die 3erGruppen wird mit %Skip verschoben
for /f "skip=%skip% tokens=3,4,5,6,7,8,9,10 delims=;" %%a in (p.csv) do call :sub %%a %%b %%c %%d %%e %%f %%g %%h
:goto :eof
:sub
REM Wenn 3er Gruppe ausgewertet wird eine Aktion durchgeführt.
REM Hier eine Info in die Excel.txt
IF %Zahl%==3 goto :bofif
goto :eofif
:bofif
REM mach Irgendwas
echo 3er Gruppe zuende >> excel.txt
goto :main
:eofif
REM Hochzählen
set /A "Zahl+=1"
set /A "skip=skip+Zahl"
echo %1 >> excel.txt
:eof
Ist in erster Näherung zusammengeschrottet, aber als Denkansatz....
Gruß Miguel
jetzt hab ich glaub ich gerafft. Wenn Du nachdem die 3er Gruppen ausgewertet wurden (gehören ja zusammen). Soll eine Aktion durchgeführt werden, dann auslesen der nächsten Dreiergruppen bis zum Ende ?
REM Achtung erste Zeile wird nicht ausgelesen, dort können die Tabelleninfos stehen
set /A "skip=1"
:main
set /A "zahl=0"
REM Beginn der für die 3erGruppen wird mit %Skip verschoben
for /f "skip=%skip% tokens=3,4,5,6,7,8,9,10 delims=;" %%a in (p.csv) do call :sub %%a %%b %%c %%d %%e %%f %%g %%h
:goto :eof
:sub
REM Wenn 3er Gruppe ausgewertet wird eine Aktion durchgeführt.
REM Hier eine Info in die Excel.txt
IF %Zahl%==3 goto :bofif
goto :eofif
:bofif
REM mach Irgendwas
echo 3er Gruppe zuende >> excel.txt
goto :main
:eofif
REM Hochzählen
set /A "Zahl+=1"
set /A "skip=skip+Zahl"
echo %1 >> excel.txt
:eof
Ist in erster Näherung zusammengeschrottet, aber als Denkansatz....
Gruß Miguel
Hi,
erstmal Teilantworten bis am Ende, ein Vorschlag von mir steht.
1) Signal_1 usw werden doch nur hochgezählt oder.
Erzeugt in test.txt
signal_1
signal_2
signal_3
2)
erzeugt:
Typ 3
[Signal_1_Art_30]
[Signal_2_Art_30]
[Signal_3_Art_30]
3) Jetzt kommt es:
Innerhalb der Hochzählschleife, wird mit findstr (ge/bli; gn/bli; rt/bli) gesucht. findstr /N gibt die Zeilenzahl an, getrennt mit Doppelpunkt (ZB 5.
Durch das Hochzählen in der For Schleife wird %zahl% definiert. Diese legt fest welche Zeile zu betrachten ist, stimmt diese Zahl mit dem Überein, was findstr gefunden hat, wird entsprechend ge/bli usw ausgegeben. Es funktioniert auch dann noch wenn zb ge/bli doppelt vorkommt.
Die Spaltenzahl ist hier nicht wichtig, da über findstr durchgeschliffen. Das macht die Sache viel einfacher, da wir nicht mehr mit Spalten arbeiten müssen.
findstr /N "ge/bli" plt.txt' gibt mir die Zeilenzahl in der ge/bli vorkommt. Damit nicht die erstbeste ge/bli genommen wird (kann ja mehrmals vorkommen), wird %zahl% benötigt.
4) Alles Zusammen (es kommt noch schlimmer unter 6):
Erzeugt:
Typ 3
[Signal_1_Art_30]
ge/bli
[Signal_2_Art_30]
gn/bli
[Signal_3_Art_30]
rt/bli
5) Jetzt die Übelste Variante, die Tabelle enthält mehr Typen (1-3 zb)
Sei die Tabelle in der Form
dann ergibt sich:
6) Entfassung Batch:
- Für einen Haufen Typen egal ob sie exisiteren oder nicht. Sie werden dann nicht ausgegeben.
Dafür %test% Variable definiert und test, ob Typ vorhanden.
more +%heradera% %datei% sorgt, dafür das der Kopf der Tabelle irgnoriert wird.
for /F "tokens=1,2 delims=;" %%a in ('more +%headera% %datei%^|find "%1;"') Do set /A "test=%%a" && set Art=%%b
if not %test%==%1 goto :eff
- Es können mehrere Farbwerte pro Zeile vorkommen (rt/bli;ge/bli)
- Spaltenposition für Farbwerte egal
Gruß Miguel
erstmal Teilantworten bis am Ende, ein Vorschlag von mir steht.
1) Signal_1 usw werden doch nur hochgezählt oder.
for /L %%i IN (1,1,3) DO echo Signal_%%i >> test.txt
signal_1
signal_2
signal_3
2)
for /F "tokens=1,2 delims=;" %%a in ('find "3" plt.txt') Do set typ=%%a && set art=%%b
echo Typ %typ% >> test.txt
for /L %%i IN (1,1,3) DO call :sub %%i
goto :eof
:sub
echo [Signal_%1_Art_%Art%] >> test.txt
:eof
Typ 3
[Signal_1_Art_30]
[Signal_2_Art_30]
[Signal_3_Art_30]
3) Jetzt kommt es:
Innerhalb der Hochzählschleife, wird mit findstr (ge/bli; gn/bli; rt/bli) gesucht. findstr /N gibt die Zeilenzahl an, getrennt mit Doppelpunkt (ZB 5.
Durch das Hochzählen in der For Schleife wird %zahl% definiert. Diese legt fest welche Zeile zu betrachten ist, stimmt diese Zahl mit dem Überein, was findstr gefunden hat, wird entsprechend ge/bli usw ausgegeben. Es funktioniert auch dann noch wenn zb ge/bli doppelt vorkommt.
Die Spaltenzahl ist hier nicht wichtig, da über findstr durchgeschliffen. Das macht die Sache viel einfacher, da wir nicht mehr mit Spalten arbeiten müssen.
findstr /N "ge/bli" plt.txt' gibt mir die Zeilenzahl in der ge/bli vorkommt. Damit nicht die erstbeste ge/bli genommen wird (kann ja mehrmals vorkommen), wird %zahl% benötigt.
for /L %%i IN (1,1,3) DO call :sub %%i
goto :eof
:sub
echo [Signal_%1_Art_%Art] >> test.txt
set /A "zahl=%1+4"
for /F "delims=:" %%a in ('findstr /N "ge/bli" plt.txt') Do IF %%a==%zahl% echo ge/bli >> test.txt
for /F "delims=:" %%a in ('findstr /N "gn/bli" plt.txt') Do IF %%a==%zahl% echo gn/bli >> test.txt
for /F "delims=:" %%a in ('findstr /N "rt/bli" plt.txt') Do IF %%a==%zahl% echo rt/bli >> test.txt
:eof
REM ---------------------- Snipp ---------------------------------------
REM Header der Tabelle
REM Zahl der Zeilen die nicht ausgewertet werden.
set /A "header=4"
set datei=plt.txt
set output=test.txt
REM Hochzählvariable
set /A "zahl=0"
REM TYP und Art bestimmen
for /F "tokens=1-2 delims=;" %%a in ('find "3" %datei%') Do set typ=%%a && set art=%%b
echo Typ %typ% >> %output%
REM Signalnummer und Farben reinziehen
for /L %%i IN (1,1,3) DO call :sub %%i
goto :eof
:sub
echo [Signal_%1_Art_%Art%] >> %output%
set /A "zahl=%1+%header%"
REM Suchen der einzelnen Farben, Ausgabe der Zeilenzahl und prüfen ob es mit dem
REM Counter übereinstimmt
for /F "delims=:" %%a in ('findstr /N "ge/bli" %datei%') Do IF %%a==%zahl% echo ge/bli >> %output%
for /F "delims=:" %%a in ('findstr /N "gn/bli" %datei%') Do IF %%a==%zahl% echo gn/bli >> %output%
for /F "delims=:" %%a in ('findstr /N "rt/bli" %datei%') Do IF %%a==%zahl% echo rt/bli >> %output%
:eof
REM ---------------------- Snapp ---------------------------------------
Erzeugt:
Typ 3
[Signal_1_Art_30]
ge/bli
[Signal_2_Art_30]
gn/bli
[Signal_3_Art_30]
rt/bli
5) Jetzt die Übelste Variante, die Tabelle enthält mehr Typen (1-3 zb)
Sei die Tabelle in der Form
"SW
Typ";"SW-
Art";GS1;"GS2/
LS2";LS3;LS4;LS5;LS6;LS7;LS8
3;32;;;ge/bli;;;;;
;;;;;;gn/bli;;;
;;;;;;;;rt/bli;
1;66;;;gn/bli;;;;;
;;;;;;gn/bli;;;
;;;;;;;;rt/bli;
2;20;;;rt/bli;;;;;
;;;;;;gn/bli;;;
;;;;;;;;rt/bli;
dann ergibt sich:
Typ 1
[Signal_1_Art_66]
gn/bli
[Signal_2_Art_66]
gn/bli
[Signal_3_Art_66]
rt/bli
Typ 2
[Signal_1_Art_20]
rt/bli
[Signal_2_Art_20]
gn/bli
[Signal_3_Art_20]
rt/bli
Typ 3
[Signal_1_Art_32]
ge/bli
[Signal_2_Art_32]
gn/bli
[Signal_3_Art_32]
rt/bli
6) Entfassung Batch:
- Für einen Haufen Typen egal ob sie exisiteren oder nicht. Sie werden dann nicht ausgegeben.
Dafür %test% Variable definiert und test, ob Typ vorhanden.
more +%heradera% %datei% sorgt, dafür das der Kopf der Tabelle irgnoriert wird.
for /F "tokens=1,2 delims=;" %%a in ('more +%headera% %datei%^|find "%1;"') Do set /A "test=%%a" && set Art=%%b
if not %test%==%1 goto :eff
- Es können mehrere Farbwerte pro Zeile vorkommen (rt/bli;ge/bli)
- Spaltenposition für Farbwerte egal
REM ------------------SCHNIPP --------------------------------
REM Header der Tabelle
set headera=4
REM Dateiinfos
set datei=plt.txt
set output=test.txt
REM Gruppierung (hier Dreiergruppen)
set group=3
REM Anzahl der Typen (Wieviele Typen existieren)
REM Falls einer oder mehrer nicht exisitieren wird dass im Skript abgefangen.
set atyp=8
REM Zählen die einzelnen Typen hoch
for /L %%i IN (1,1,%atyp%) DO call :main %%i
goto :eof
:main
REM TYP und Art bestimmen
for /F "tokens=1,2 delims=;" %%a in ('more +%headera% %datei%^|find "%1;"') Do set /A "test=%%a" && set Art=%%b
REM Falls Type nicht existiert, deshalb %test% wird die Schleife übersprungen
if not %test%==%1 goto :eff
echo Typ %1 >> %output%
for /F "delims=:" %%a in ('more +%headera% %datei%^|findstr /N "%1;"') Do set header=%%a
REM Signalnummer und Farben reinziehen
REM Berücksichtigt wird, dass die Werte in Dreiergruppen vorliegen
REM Läßt sich einfach ändern, falls 4er oder uswer Gruppen vorliegen.
for /L %%c IN (1,1,%group%) DO call :sub %%c
goto :eff
:sub
echo [Signal_%1_Art_%Art%] >> %output%
REM Jetzt wird die 3er Gruppe ausgewertet, ab der Stelle, wo der Typ aufgetaucht ist
REM Header ist Zeile in der der Typ gefunden wurde
REM %1 Element in der 3er Gruppe
REM %headera% ist der Kopf der Tabelle.
REM %zahl% ist die Zeile in der Gruppe, die uns interessiert
set /A "zahl=%1+%header%+%headera%-1"
REM Stimmt die Zeilenzahl von findstr mit %zahl% überein,
REM dann haben wir einen Treffer und Farbe wird ausgegeben.
for %%b in (ge/bi gn/bli rt/bli) DO for /F "delims=:" %%a in ('findstr /N "%%b" %datei%') Do IF %%a==%zahl% echo %%b >> %output%
:eff
:eof
REM ------------------SCHNAPP --------------------------------
Gruß Miguel
Moin Hummel85 und Miguel,
kann mich hier aufs Mitlesen beschränken - ist alles in guten Händen, denke ich.
Nur als kleine handwerkliche Tipps (zum vorletzten Schnipsel):
Hier ginge es ohne Sub
@Hummel85
Kann denn immer nur genau EIN Farbwert pro Zeile auftauchen? Und ist die Spaltenposition unwichtig?
Gruß
Biber
kann mich hier aufs Mitlesen beschränken - ist alles in guten Händen, denke ich.
Nur als kleine handwerkliche Tipps (zum vorletzten Schnipsel):
Hier ginge es ohne Sub
...:: Jetzt
for /L %%i IN (1,1,3) DO call :sub %%i
goto :eof
:sub
echo [Signal_%1_Art_%Art] >> test.txt && rem ein %-Zeichen fehlt hinter %Art
:eof && Rem Diese Sprungmarke muss nicht gesetzt werden. Macht M$ für uns.
:: Alternativ
for /L %%i IN (1,1,3) DO echo [Signal_%%i_Art_%Art%] >> test.txt
goto :eof
@Hummel85
Kann denn immer nur genau EIN Farbwert pro Zeile auftauchen? Und ist die Spaltenposition unwichtig?
Gruß
Biber
Hi,
ich bastle gerade an einem Tutorial rum, darin ist die Suche nach Elementen und ausgabe von SPalten und Zeilen enthalten.
In Tabellen rumrechnen mittels Batch - Elemente finden und Ersetzen
Und ausserdem wäre eine Zuordung von Spaltenzahl und Signalnummer nicht schlecht.
Gruß Miguel
ich bastle gerade an einem Tutorial rum, darin ist die Suche nach Elementen und ausgabe von SPalten und Zeilen enthalten.
In Tabellen rumrechnen mittels Batch - Elemente finden und Ersetzen
Und ausserdem wäre eine Zuordung von Spaltenzahl und Signalnummer nicht schlecht.
Gruß Miguel
Hi,
nachdem das Problem immer etwas komplexer wird bzw ständig modifiziert wird,sollten wir uns eine Strategie ausdenken.
Ist nun die letzte plt.txt die Entgültige Fassung?
Wie soll es am Ende aussehen?
Wieso ist jetzt vorne bei "Art" immer das gleiche ?
Jetzt sind auf einmal mehrere Farben in einer Zeile. rt vi D ????
Du solltest deine Fragestellung nicht ständig ändern. Das führt dazu, dass das Skript nicht brachbar ist und eigentlich von Grund auf neu konzipiert werden sollte.
So kann ich auch nicht arbeiten. Sorry.
Aufgabenstellung genauer stellen....
Gruß Miguel
nachdem das Problem immer etwas komplexer wird bzw ständig modifiziert wird,sollten wir uns eine Strategie ausdenken.
Ist nun die letzte plt.txt die Entgültige Fassung?
Wie soll es am Ende aussehen?
Wieso ist jetzt vorne bei "Art" immer das gleiche ?
Jetzt sind auf einmal mehrere Farben in einer Zeile. rt vi D ????
Du solltest deine Fragestellung nicht ständig ändern. Das führt dazu, dass das Skript nicht brachbar ist und eigentlich von Grund auf neu konzipiert werden sollte.
So kann ich auch nicht arbeiten. Sorry.
Aufgabenstellung genauer stellen....
Gruß Miguel
Hi,
ich hab auch nicht so die Zeit eine Vollständige Lösung zu präsentieren.
Aber wir werden uns, dass Ding mal von der anderen Seite betrachten.
Zum Verständnis der Schleifen.
Mal ganz Sprachlich für ein 3 Zeilen Modell.
Sprach Batch ------------
Für jede Zeile (1,2,3) mach folgendes:
Wenn Du in der ersten Zeile bist gehe zu Los1, sonst gehe zu Los2.
LOS1:
Lese von der ersten bis zur letzen Spalte die Werte aus.
Ignoriere unsinnige Werte (Leerzeichen oder keine Zeichen)
Folgende Regeln sind zu beachten:
i) In der Spalte 1 ist das Signal
In der Spalte 2 ist die Art
Diese sollte ich mir merken.
ii) Spalte 3=LS1
Spalte 4=LS2
Allgemein: Für n > 2 gilt Spalte n=LS(n-2)
iii) Typdatei wird durch Zeilennummer definiert.
Zeile 1 = Typ1 usw
iv) Ausspucken von Werten in die Typdatei, sowie die LS Werte untereinander.
ENDE von LOS1
LOS2:
Falls Zeile > 1.
Lese von der 3 bis zur letzen Spalte.
Führe Teile Los.ii) und Los.iii) sowie Los.iv) aus.
Die Werte und Los.i) sind ja schon gelesen worden.
ENDE von LOS2
Sprach Batch ------------
Dieses Modell braucht schon mal 2 Schleifen. Einmal für die Spalten und einmal für die Zeilen.
Ist das so richtig?
Später kann man ja die gesamte Datei damit durchhaun.
Gruß Miguel
ich hab auch nicht so die Zeit eine Vollständige Lösung zu präsentieren.
Aber wir werden uns, dass Ding mal von der anderen Seite betrachten.
Zum Verständnis der Schleifen.
Mal ganz Sprachlich für ein 3 Zeilen Modell.
Sprach Batch ------------
Für jede Zeile (1,2,3) mach folgendes:
Wenn Du in der ersten Zeile bist gehe zu Los1, sonst gehe zu Los2.
LOS1:
Lese von der ersten bis zur letzen Spalte die Werte aus.
Ignoriere unsinnige Werte (Leerzeichen oder keine Zeichen)
Folgende Regeln sind zu beachten:
i) In der Spalte 1 ist das Signal
In der Spalte 2 ist die Art
Diese sollte ich mir merken.
ii) Spalte 3=LS1
Spalte 4=LS2
Allgemein: Für n > 2 gilt Spalte n=LS(n-2)
iii) Typdatei wird durch Zeilennummer definiert.
Zeile 1 = Typ1 usw
iv) Ausspucken von Werten in die Typdatei, sowie die LS Werte untereinander.
ENDE von LOS1
LOS2:
Falls Zeile > 1.
Lese von der 3 bis zur letzen Spalte.
Führe Teile Los.ii) und Los.iii) sowie Los.iv) aus.
Die Werte und Los.i) sind ja schon gelesen worden.
ENDE von LOS2
Sprach Batch ------------
Dieses Modell braucht schon mal 2 Schleifen. Einmal für die Spalten und einmal für die Zeilen.
Ist das so richtig?
Später kann man ja die gesamte Datei damit durchhaun.
Gruß Miguel