In Tabellen rumrechnen mittels Batch - Elemente finden und Ersetzen
21.05.2006
01:26:21 Uhr6834 Aufrufe
01:26:21 Uhr
Noch nicht bewertet
Dieser Beitrag soll zeigen, wie man mittels Batch einfache Tabellenkalkulationen durchführen kann und Werte in einer Tabelle finden kann mit Ausgabe von Spalte und Zeile. Mit Windows Boardmitteln und mit Nutzung von Cut,Head,Tail,Sedf . Hinweise, Kritik und Bemerkungen sind willkommen.
Gegeben sei der Einfachheit halber folgende Tabelle ohne doppelte Einträge (erstmal), aber jeder Eintrag ist belegt.
1;20
2;21
Trennzeichen sind erstmal Semikolons.
Aufgabenstellung:
- Wo ist der Wert 20 in dieser Tabelle? Ausgabe von Spalten und Zeilen Infos.
- Wie lautet der Wert in Spalte 2 und Zeile 1? Ausgabe des Wertes
- Wie ist die Summe von Element (1,2) und (2,1) ?
- Wie ist die Summe in der zweiten Spalte?
- Addiere in eine bestimmte Zeile/Spalte ohne vorherige Kenntnis des Wertes eine Zahl bzw ersetze Wert.
- Der ganze Aufriss soll auch mit Tabellen mit mehr als 50 Spalten funktionieren.Bzw wir wollen uns nicht mit einen Haufen tokens zum Auslesen herumplagen.- Und zu guter letzt soll alles auch mit beliebigen Tabelleneinträgen funktionieren.(Modus 3 und 4 geht nur für ganze Zahlen)
Am Ende steht eine Funktion, mithilfe man den Kram da oben durchführen kann.
------------------------------------------------------------------------------------------------------
Erstmal bauen wir uns langsam die Funktionen zusammen.Hier gilt der Weg ist das Ziel.
Der erste Teil beschäftigt sich mit Tabellen ohne doppelte Einträge und ganzen Zahlen als Elementen.
[Anmerkung: ja es geht auch einfacher und kompakter. Aber die Struktur in den ersten Beispielen ist so gewählt, dass am Ende die Funktion besser verstanden wird. Auch ist so die langsame Entstehung ersichtlich. Es geht auch mit anderen Skriptsprachen, aber es soll gezeigt werden, dass man mit MS-DOS Batch eine Menge machen kann.]
Im Verlauf werden auch Methoden mit cut,head,tail,sed dargestellt (aus der Unix Welt) die unser Problem einfach lösen.
Quelle:
http://unxutils.sourceforge.net/
Vorbereitung:
Erzeugt uns eine Matrix ala:
1 1
1 2
2 1
2 2
Die wir so lesen werden.
2 1 heißt 2. Spalte 1.Zeile usw. Also die Koordinaten der Tabelle.
Wir gehen die einzelnen Spalten und Zeilen durch und geben Ihren Inhalt in die farben.txt aus.
In der ersten FOR-Schleife werden die Spalten durchgegangen. Im ersten Durchgang wird die erste Spalte ausgewertet. Dann das token in der zweiten FOR-Schleife geschoben (tokens=%1).
In der inneren FOR-Schleife wird der Beginn der Auswertung (Skip) nach oben gezählt (mittels %azeile%).
Das blöde ist, dass
1) Die Innere FOR-Schleife mehrere Zeilen auswertet. Deshalb wird ein Counter eingebaut %count%. Der dafür sorgt, dass nur eine Zeile ausgegeben wird (unschön)
2) In der inneren FOR-Schleife kein skip=0 stehen kann, warum auch immer. Deshalb wird unsere Tabelle mit einem Header ausgestattet, damit der Code funktioniert.
Die Tabelle sieht nun so aus:
--- tabelle----
1;20
2;21
Gibt uns aus Inhalt:
Wert 1 in Zeile 1 Spalte 1
Wert 2 in Zeile 2 Spalte 1
Wert 20 in Zeile 1 Spalte 2
Wert 21 in Zeile 2 Spalte 2
1) findstr oder head, tail, cut?
findstr /N "20" tabelle.txt gibt uns folgendes aus:
1:1;20
Diese Ausgabe müssen wir so verarzten, dass wir die 1: als Zeileninfo auslesen können. Als Token wird : benutzt. Bietet sich hier ganz gut an.
Aber mit findstr /N "2" tabelle.txt kommt
1:1;20
2:2;21
2:2;21
raus. Ist etwas unangenehm. Aber bedarf einiger Entwicklungsarbeit.
Vorerst scannen wir die Tabelle Element für Element durch. Ja, das ist nicht schnell.
Mit den Tools cut,head,tail kann man ohne weiteres die Aufgaben erfüllen.
Wir sehen gleich wie man diese Tools benutzt.
2) Frage: In welcher Spalte befindet sich der Wert 20 ??
Hier wird der Inhalt jeder Zelle mit %wert% verglichen, wenn diese gleich sind wird die Spalte und Zeile ausgegeben.
Das Skrip in 0) wurde nur mit einer if %1==%wert% erweitert.
Inhalt farben.txt:
Wert 20 in Zeile 1 Spalte 2
2.a) Mittels. Head,cut.tail ?
Hier eine nette Fassung. Diese gibt uns die Anzahl der Treffer und die Positionen der Elemente an.
Diese benötigt in der Tabelle keinen künstlichen Header und die einzelnen Zellen können leer sein.
Geht also auch für eine Tabelle
; ;;;;;20;9;;
;;;3;8899;
Befehle
head -3l tabelle.txt gibt uns die ersten 3 Zeilen von tabelle.txt aus.
tail -1l tabelle.txt gibt uns die letzt Zeile aus (wird von hinten gezählt).
cut -d; -f2 tabelle.txt gibt uns die zweite Spalte (f2) der Tabelle aus. mit d; wird das Trennzeichen übergeben.
head -3l %tabelle%|tail -1l|cut -d; -f2
gibt uns also das 2 Element der 3 Spalte aus.
Hier ist noch, dass Problem, dass mittels findstr auch Teile eines Elementes gefunden werden beseitigt. Zwar findet findstr bei "20" auch 2000 und 200. Aber durch die Prüfung des Wertes in der inneren FOR Schleife, wird dieses Problem beseitigt.
3) Frage: Welcher Wert ist in der ersten Zeile und zweiten Spalte ?
Erstmal mit dem Skript unter 2/3). Ist zwar etwas umständlich, da die gesamte Tabelle durchgescant wird.
Ist der Spaltenzähler gleich x und der Zeilenzähler gleich y. Wird die Zelle ausgegeben.
Gibt uns wie erwartet 20 aus.
3.a) Wert in einer bestimmten Spalte/Zeile mittels head, cut, tail?
Aber die Befehle verweigern sich in einer FOR Schleife zu arbeiten, deshalb wird eine temp.txt erzeugt, die den aktuellen Wert enthält.
4.a) Bestimmen der Spalten und Zeilenzahl einer Datei mit Semikolons als Trennzeichen.
Schön wäre es, wenn wir aus der Tabelle ohne weiteres die Zeilenzahl und Spaltenzahl herausziehen können, damit können wir an das Skript einfach eine Tabelle übergegen und es macht es schon.
Idee. Mit Findstr wird das Semikolons gesucht. Die Ausgabe ist ja
ZB:
1:2;20
2:45;56
In der ersten Zeile ist die Zeilennummer. Interessieren tuen wir uns nur für die letzte Zeile der Ausgabe, diese ist ja die Zeilenzahl der Tabelle.
Die Spaltenzahl wird etwas komplizierter gesucht.
Version 2):
Die Zeichen einer Spalte einzeln auf Belegung geprüft. Ist kein Wert vorhanden ist die Zeile zuende.Wobei dabei ausgenutzt wird, dass die for Schleife irgendwann einen Fehler ausgibt uns selbst rausspringt (sonst wäre es eine Endlosschleife.
.4.b) Alles mit Cut;head,Tail.
Ja man kann die Zeilenzahl auch mit grep -c ; tabelle.txt herausbekommen.
Zwingend bei diesem Code ist also, dass es keine Leeren Elemente gibt und wie es mit anderen Trennzeichen ist ???
-------------------------------------------------------------------------------------
A) Alles zusammen in einem Skript
Aufrufe:
1) Frage: Element: 1 Zeile und 2 Spalte plus Element: 2 Zeile und 1 Spalte
2) Frage: Summe der Elemente in der ersten Spalte
2) Frage: Summe der Elemente in der ersten Zeile
3) Suchen eines Elementes in der ersten Spalte
4) Addiere 8 auf den Wert in der zweiten Spalte und zweiten Zeile.
Hierfür wird sed benutzt.
(Quelle und Anleitung: http://www.student.northpark.edu/pemente/ ... )
Für den Anfang sei folgendes gesagt.
sed "5 s/45/50/1" tabelle.txt > ausgabe.txt
Macht folgendes: In der 5 Zeile wird das erste Vorkommen (1) von 45 durch 50 ersetzt. Die gesamte Tabelle wird in ausgabe.txt ausgegeben.
set "1,5 s/45/50/g" tabelle.txt > ausgabe.txt
Ersetzt uns von der Zeile 1 bis 5 die 45 gegen 50. g steht hier für global.
set "s/45/50/g" tabelle.txt > ausgabe.txt
Ersetzt alle 45 gegen 50.
Für den Anfang begnügen wir uns, damit das in der Tabelle keine doppelten Elemente vorkommen.
Also nicht 50;50 oder 4050;50.
Ziel soll es aber sein ein bestimmtes Element zu ersetzen. (Wird noch gebaut)
Jetzt der Code.
1;20
2;21
Trennzeichen sind erstmal Semikolons.
Aufgabenstellung:
- Wo ist der Wert 20 in dieser Tabelle? Ausgabe von Spalten und Zeilen Infos.
- Wie lautet der Wert in Spalte 2 und Zeile 1? Ausgabe des Wertes
- Wie ist die Summe von Element (1,2) und (2,1) ?
- Wie ist die Summe in der zweiten Spalte?
- Addiere in eine bestimmte Zeile/Spalte ohne vorherige Kenntnis des Wertes eine Zahl bzw ersetze Wert.
- Der ganze Aufriss soll auch mit Tabellen mit mehr als 50 Spalten funktionieren.Bzw wir wollen uns nicht mit einen Haufen tokens zum Auslesen herumplagen.- Und zu guter letzt soll alles auch mit beliebigen Tabelleneinträgen funktionieren.(Modus 3 und 4 geht nur für ganze Zahlen)
Am Ende steht eine Funktion, mithilfe man den Kram da oben durchführen kann.
------------------------------------------------------------------------------------------------------
Inhaltsverzeichnis
Erstmal bauen wir uns langsam die Funktionen zusammen.Hier gilt der Weg ist das Ziel.
Der erste Teil beschäftigt sich mit Tabellen ohne doppelte Einträge und ganzen Zahlen als Elementen.
[Anmerkung: ja es geht auch einfacher und kompakter. Aber die Struktur in den ersten Beispielen ist so gewählt, dass am Ende die Funktion besser verstanden wird. Auch ist so die langsame Entstehung ersichtlich. Es geht auch mit anderen Skriptsprachen, aber es soll gezeigt werden, dass man mit MS-DOS Batch eine Menge machen kann.]
Im Verlauf werden auch Methoden mit cut,head,tail,sed dargestellt (aus der Unix Welt) die unser Problem einfach lösen.
Quelle:
http://unxutils.sourceforge.net/
Vorbereitung:
01.
REM Anzahl der Spalten und Zeilen 02.
set tspalt=2 03.
set tzeile=2 04.
05.
REM Hochzählen und Ausgeben. 06.
for /L %%c IN (1,1,%tspalt%) DO (for /L %%d IN (1,1,%tzeile%) DO echo %%c %%d >> test.txt)Erzeugt uns eine Matrix ala:
1 1
1 2
2 1
2 2
Die wir so lesen werden.
2 1 heißt 2. Spalte 1.Zeile usw. Also die Koordinaten der Tabelle.
0) Inhalt der Tabelle in einer Spalte
Wir gehen die einzelnen Spalten und Zeilen durch und geben Ihren Inhalt in die farben.txt aus.
In der ersten FOR-Schleife werden die Spalten durchgegangen. Im ersten Durchgang wird die erste Spalte ausgewertet. Dann das token in der zweiten FOR-Schleife geschoben (tokens=%1).
In der inneren FOR-Schleife wird der Beginn der Auswertung (Skip) nach oben gezählt (mittels %azeile%).
Das blöde ist, dass
1) Die Innere FOR-Schleife mehrere Zeilen auswertet. Deshalb wird ein Counter eingebaut %count%. Der dafür sorgt, dass nur eine Zeile ausgegeben wird (unschön)
2) In der inneren FOR-Schleife kein skip=0 stehen kann, warum auch immer. Deshalb wird unsere Tabelle mit einem Header ausgestattet, damit der Code funktioniert.
Die Tabelle sieht nun so aus:
--- tabelle----
1;20
2;21
01.
set tspalt=2 02.
set tzeile=2 03.
04.
for /L %%c IN (1,1,%tspalt%) DO (for /L %%d IN (1,1,%tzeile%) DO call :sub %%c %%d) 05.
goto :eof 06.
:sub 07.
echo %1 %2 >> test.txt 08.
set aspalte=%1 09.
set /a "azeile=%2" 10.
set /a "count=0" 11.
for /f "skip=%azeile% delims=; tokens=%1" %%a in (tabelle.txt) Do call :sub2 %%a 12.
goto :eof 13.
:sub2 14.
IF %count%==0 echo Wert %1 in Zeile %azeile% Spalte %aspalte% >> farben.txt 15.
set /a "count+=1" 16.
goto :eofErkenntnis: %%a ist der Wert in der Zelle.
%%c Spaltencounter
%%d Zeilencounter
%%c Spaltencounter
%%d Zeilencounter
Gibt uns aus Inhalt:
Wert 1 in Zeile 1 Spalte 1
Wert 2 in Zeile 2 Spalte 1
Wert 20 in Zeile 1 Spalte 2
Wert 21 in Zeile 2 Spalte 2
1) findstr oder head, tail, cut?
findstr /N "20" tabelle.txt gibt uns folgendes aus:
1:1;20
Diese Ausgabe müssen wir so verarzten, dass wir die 1: als Zeileninfo auslesen können. Als Token wird : benutzt. Bietet sich hier ganz gut an.
01.
for /L %%c IN (1,1,2) DO call :sub %%c 02.
goto :eof 03.
:sub 04.
set spalte=%1 05.
for /f "delims=; tokens=%1" %%a in (tabelle.txt) Do call :sub2 %%a 06.
goto :eof 07.
:sub2 08.
REM Suchen in findstr /N "%1" tabelle.txt' nach Zeilenzahl 09.
for /F "delims=:" %%b in ('findstr /N "%1" tabelle.txt') Do set zeile=%%b 10.
echo %1 in Spalte %Spalte%; Zeile %zeile% >> farben.txtAber mit findstr /N "2" tabelle.txt kommt
1:1;20
2:2;21
2:2;21
raus. Ist etwas unangenehm. Aber bedarf einiger Entwicklungsarbeit.
Vorerst scannen wir die Tabelle Element für Element durch. Ja, das ist nicht schnell.
Mit den Tools cut,head,tail kann man ohne weiteres die Aufgaben erfüllen.
Wir sehen gleich wie man diese Tools benutzt.
2) Frage: In welcher Spalte befindet sich der Wert 20 ??
Hier wird der Inhalt jeder Zelle mit %wert% verglichen, wenn diese gleich sind wird die Spalte und Zeile ausgegeben.
Das Skrip in 0) wurde nur mit einer if %1==%wert% erweitert.
01.
set tspalt=2 02.
set tzeile=2 03.
set wert=20 04.
for /L %%c IN (1,1,%tspalt%) DO (for /L %%d IN (1,1,%tzeile%) DO call :sub %%c %%d) 05.
goto :eof 06.
:sub 07.
echo %1 %2 >> test.txt 08.
set aspalte=%1 09.
set /a "azeile=%2" 10.
set /a "count=0" 11.
for /f "skip=%azeile% delims=; tokens=%1" %%a in (tabelle.txt) Do call :sub2 %%a 12.
goto :eof 13.
:sub2 14.
IF %count%==0 if %1==%wert% echo Wert %1 in Zeile %azeile% Spalte %aspalte% >> farben.txt 15.
set /a "count+=1" 16.
goto :eofInhalt farben.txt:
Wert 20 in Zeile 1 Spalte 2
2.a) Mittels. Head,cut.tail ?
Hier eine nette Fassung. Diese gibt uns die Anzahl der Treffer und die Positionen der Elemente an.
Diese benötigt in der Tabelle keinen künstlichen Header und die einzelnen Zellen können leer sein.
Geht also auch für eine Tabelle
; ;;;;;20;9;;
;;;3;8899;
Befehle
head -3l tabelle.txt gibt uns die ersten 3 Zeilen von tabelle.txt aus.
tail -1l tabelle.txt gibt uns die letzt Zeile aus (wird von hinten gezählt).
cut -d; -f2 tabelle.txt gibt uns die zweite Spalte (f2) der Tabelle aus. mit d; wird das Trennzeichen übergeben.
head -3l %tabelle%|tail -1l|cut -d; -f2
gibt uns also das 2 Element der 3 Spalte aus.
01.
REM Tabelleninfos 02.
set tabelle=tabelle.txt 03.
set delimiter=; 04.
set tspalt=4 05.
06.
set output=farben.txt 07.
set tempd=temp.txt 08.
set wert=miguel 09.
10.
REM Um die Anzahl der Treffer zu bestimmen. 11.
set /a "count=0" 12.
13.
REM Suchen nach dem Element mit findstr. Zeilen herausfischen und das an Tab übergeben. 14.
15.
for /L %%c in (1,1,%tspalt%) Do for /f "delims=:" %%a in ('more %tabelle%^|findstr /N "%wert%"') Do call :tab %%a %%c 16.
if not %count%==0 (echo Anzahl Treffer %count% >> %output%) else echo nichts gefunden >> %output% 17.
18.
goto :eof 19.
20.
REM Element ausgeben 21.
:tab 22.
head -%1l %tabelle%|tail -1l|cut -d%delimiter% -f%2 >> %tempd% 23.
for /f %%a in (%tempd%) Do IF %%a==%wert% echo Wert ist in Spalte %2 und Zeile %1 >> %output% && set /a "count+=1" 24.
del temp.txt 25.
goto :EofHier ist noch, dass Problem, dass mittels findstr auch Teile eines Elementes gefunden werden beseitigt. Zwar findet findstr bei "20" auch 2000 und 200. Aber durch die Prüfung des Wertes in der inneren FOR Schleife, wird dieses Problem beseitigt.
3) Frage: Welcher Wert ist in der ersten Zeile und zweiten Spalte ?
Erstmal mit dem Skript unter 2/3). Ist zwar etwas umständlich, da die gesamte Tabelle durchgescant wird.
Ist der Spaltenzähler gleich x und der Zeilenzähler gleich y. Wird die Zelle ausgegeben.
01.
set tspalt=2 02.
set tzeile=4 03.
04.
set x=1 05.
set y=4 06.
07.
for /L %%c IN (1,1,%tspalt%) DO (for /L %%d IN (1,1,%tzeile%) DO call :sub %%c %%d) 08.
goto :eof 09.
:sub 10.
set /a "aspalte=%1" 11.
set /a "azeile=%2" 12.
set /a "count=0" 13.
for /f "skip=%azeile% delims=; tokens=%1" %%a in (tabelle.txt) Do call :sub2 %%a 14.
goto :eof 15.
:sub2 16.
IF %count%==0 if %aspalte%==%x% if %azeile%==%y% echo %1 >> farben.txt 17.
set /a "count+=1" 18.
goto :eofGibt uns wie erwartet 20 aus.
3.a) Wert in einer bestimmten Spalte/Zeile mittels head, cut, tail?
Aber die Befehle verweigern sich in einer FOR Schleife zu arbeiten, deshalb wird eine temp.txt erzeugt, die den aktuellen Wert enthält.
01.
set tabelle=tabelle.txt 02.
set delimiter=; 03.
04.
set y=2 05.
set x=2 06.
07.
call :tab %y% %x% 08.
echo Wert ist %ausgabew% >> farben.txt 09.
goto :eof 10.
11.
REM Element ausgeben 12.
:tab 13.
head -%1l %tabelle%|tail -1l|cut -d%delimiter% -f%2 >> temp.txt 14.
for /f %%a in (temp.txt) Do set ausgabew=%%a 15.
del temp.txt 16.
goto :Eof4.a) Bestimmen der Spalten und Zeilenzahl einer Datei mit Semikolons als Trennzeichen.
Schön wäre es, wenn wir aus der Tabelle ohne weiteres die Zeilenzahl und Spaltenzahl herausziehen können, damit können wir an das Skript einfach eine Tabelle übergegen und es macht es schon.
Idee. Mit Findstr wird das Semikolons gesucht. Die Ausgabe ist ja
ZB:
1:2;20
2:45;56
In der ersten Zeile ist die Zeilennummer. Interessieren tuen wir uns nur für die letzte Zeile der Ausgabe, diese ist ja die Zeilenzahl der Tabelle.
Die Spaltenzahl wird etwas komplizierter gesucht.
Version 2):
Die Zeichen einer Spalte einzeln auf Belegung geprüft. Ist kein Wert vorhanden ist die Zeile zuende.Wobei dabei ausgenutzt wird, dass die for Schleife irgendwann einen Fehler ausgibt uns selbst rausspringt (sonst wäre es eine Endlosschleife.
01.
REM Tabelleninfos 02.
set tabelle=tabelle.txt 03.
set delimiter=; 04.
set header=1 05.
06.
set output=farben.txt 07.
08.
for /f "delims=:" %%b in ('more +%header% %tabelle%^|findstr /N "%delimiter%"') DO set /a "zeilenzahl=%%b" 09.
set /a "count=0" 10.
11.
:beginnt 12.
set /a "count+=1" 13.
for /f "tokens=%count% delims=%delimiter%" %%a in ('more +%zeilenzahl% %tabelle%') DO goto :beginnt 14.
15.
set /a "spaltenzahl=%count%-1" 16.
echo Spalten %Spaltenzahl%; Zeilen %Zeilenzahl%; Header %header% >> %output% 17.
.4.b) Alles mit Cut;head,Tail.
Ja man kann die Zeilenzahl auch mit grep -c ; tabelle.txt herausbekommen.
Zwingend bei diesem Code ist also, dass es keine Leeren Elemente gibt und wie es mit anderen Trennzeichen ist ???
01.
REM Tabelleninfos 02.
set tabelle=tabelle.txt 03.
set delimiter=; 04.
set header=1 05.
06.
set output=farben.txt 07.
set tempd=temp.txt 08.
09.
for /f "delims=:" %%b in ('more +%header% %tabelle%^|findstr /N ";"') DO set /a "zeilenzahl=%%b" 10.
11.
set /a "count=0" 12.
13.
:beginnt 14.
del %tempd% 15.
set /a "count+=1" 16.
head -2l %tabelle%|tail -1l|cut -d%delimiter% -f%count% >> %tempd% 17.
for /f %%a in (%tempd%) Do IF not defined %%a (goto :beginnt) 18.
19.
del %tempd% 20.
set /a "spaltenzahl=%count%-1" 21.
echo Spalten %Spaltenzahl%; Zeilen %Zeilenzahl%; Header %header% >> %output% 22.
-------------------------------------------------------------------------------------
A) Alles zusammen in einem Skript
01.
@echo off 02.
REM Tabellenbatch mit CUT,TAIL,HEAD,FINDSTR 03.
@echo off 04.
REM ---------------------------------------------------- 05.
REM Externe Paramter 06.
set tabelle=tabelle.txt 07.
set delimiter=; 08.
set header=1 09.
REM ---------------------------------------------------- 10.
11.
REM ---------------------------------------------------- 12.
REm Interne Paramter 13.
set tempd=%temp%\tabtemp.txt 14.
set output=farben.txt 15.
set /a "count=0" 16.
REM ---------------------------------------------------- 17.
18.
19.
:main 20.
REM ---------------------------------------------------- 21.
REM Externe Paramter 22.
set tabelle=tabelle.txt 23.
set delimiter=; 24.
set header=1 25.
REM ---------------------------------------------------- 26.
27.
REM Hier kommen die Befehle rein 28.
29.
30.
31.
32.
REM---- 33.
34.
goto :eof 35.
36.
REM ----------------------------------------- 37.
REM tabelleninfos 38.
39.
REM Zeilenzahl bestimmen 40.
:spaltcount 41.
42.
set /a "countt=0" 43.
if not defined zeilenzahl call :zeilencount 44.
:beginnt 45.
set /a "countt+=1" 46.
for /f "tokens=%countt% delims=%delimiter%" %%a in ('more +%zeilenzahl% %tabelle%') DO goto :beginnt 47.
48.
set /a "spaltenzahl=%countt%-1" 49.
50.
goto :eof 51.
REM ----------------------------------------- 52.
53.
REM ----------------------------------------- 54.
REM Spaltenzahl ermitteln 55.
:zeilencount 56.
for /f "delims=:" %%b in ('more +%header% %tabelle%^|findstr /N "%delimiter%"') DO set /a "zeilenzahl=%%b" 57.
goto :eof 58.
REM ----------------------------------------- 59.
60.
REM ----------------------------------------- 61.
REM Element ausgeben 62.
:element 63.
REM Header berücksichtigen 64.
if exist %tempd% del %tempd% 65.
set /a "yoff=%1+%header%" 66.
head -%yoff%l %tabelle%|tail -1l|cut -d%delimiter% -f%2 >> %tempd% 67.
for /f %%a in (%tempd%) Do set ausgabew=%%a 68.
del %tempd% 69.
goto :Eof 70.
REM ----------------------------------------- 71.
72.
REM ----------------------------------------- 73.
:suche 74.
if exist %tempd% del %tempd% 75.
set /a "count=0" 76.
if not defined spaltenzahl call :spaltcount 77.
for /L %%c in (1,1,%spaltenzahl%) Do for /f "delims=:" %%a in ('more %tabelle%^|findstr /N "%wert%"') Do call :sub %%a %%c 78.
goto :eof 79.
:sub 80.
set /a "yoff=%1" 81.
set /a "ya=%1-%header%" 82.
head -%yoff%l %tabelle%|tail -1l|cut -d%delimiter% -f%2 >> %tempd% 83.
for /f %%a in (%tempd%) Do IF %%a==%wert% echo Wert %wert% gefunden in Spalte %2 und Zeile %ya% >> %output% && set /a "count+=1" 84.
del %tempd% 85.
goto :eof 86.
REM ----------------------------------------- 87.
88.
89.
REM ----------------------------------------- 90.
:ausgabe 91.
echo Wert ist %ausgabew% >> %output% 92.
if defined wert (if not %count%==0 (echo Anzahl Treffer %count% >> farben.txt) else echo nichts gefunden >> %output%) 93.
if defined %spaltenzahl% if defined %zeilenzahl% echo Spalten %Spaltenzahl%; Zeilen %Zeilenzahl%; Header %header% >> %output% 94.
goto :eof 95.
REM ----------------------------------------- 96.
97.
----------------------------------------------------------------------------------------------------------------------------------- 98.
Aufrufe:
1) Frage: Element: 1 Zeile und 2 Spalte plus Element: 2 Zeile und 1 Spalte
01.
:main 02.
set y=1 03.
set x=2 04.
call :element %y% %x% 05.
set /a "Summe+=%ausgabew%" 06.
07.
set x=1 08.
set y=2 09.
call :element %y% %x% 10.
set /a "Summe+=%ausgabew%" 11.
echo summe ist %summe% >> summe.txt 12.
goto :eof2) Frage: Summe der Elemente in der ersten Spalte
01.
:main 02.
03.
call :zeilencount 04.
set x=1 05.
06.
call :addiere 07.
echo summe in der Spalte %x% ist %summe% >> summe.txt 08.
09.
goto :eof 10.
11.
:addiere 12.
for /L %%a in (1,1,%zeilenzahl%) DO call :sum %%a 13.
goto :eof 14.
:sum 15.
call :element %1 %x% 16.
set /a "Summe+=%ausgabew%" 17.
18.
goto :eof2) Frage: Summe der Elemente in der ersten Zeile
01.
:main 02.
03.
call :zeilencount 04.
call :spaltcount 05.
06.
set y=1 07.
08.
call :addiere 09.
echo summe in der Zeile %y% ist %summe% >> summe.txt 10.
11.
goto :eof 12.
13.
:addiere 14.
for /L %%a in (1,1,%spaltenzahl%) DO call :sum %%a 15.
goto :eof 16.
:sum 17.
call :element %y% %1 18.
set /a "Summe+=%ausgabew%" 19.
20.
goto :eof 21.
3) Suchen eines Elementes in der ersten Spalte
01.
:main 02.
03.
call :zeilencount 04.
call :spaltcount 05.
06.
REM Suchen in der ersten Spalte 07.
set wert=2 08.
09.
set x=1 10.
for /l %%a in (1,1,%zeilenzahl%) DO call :typb %%a 11.
goto :eof 12.
:typb 13.
call :element %1 %x% 14.
IF %ausgabew%==%wert% echo %wert% in Zeile %1 >> signal.txt 15.
16.
goto :eof4) Addiere 8 auf den Wert in der zweiten Spalte und zweiten Zeile.
Hierfür wird sed benutzt.
(Quelle und Anleitung: http://www.student.northpark.edu/pemente/ ... )
Für den Anfang sei folgendes gesagt.
sed "5 s/45/50/1" tabelle.txt > ausgabe.txt
Macht folgendes: In der 5 Zeile wird das erste Vorkommen (1) von 45 durch 50 ersetzt. Die gesamte Tabelle wird in ausgabe.txt ausgegeben.
set "1,5 s/45/50/g" tabelle.txt > ausgabe.txt
Ersetzt uns von der Zeile 1 bis 5 die 45 gegen 50. g steht hier für global.
set "s/45/50/g" tabelle.txt > ausgabe.txt
Ersetzt alle 45 gegen 50.
Für den Anfang begnügen wir uns, damit das in der Tabelle keine doppelten Elemente vorkommen.
Also nicht 50;50 oder 4050;50.
Ziel soll es aber sein ein bestimmtes Element zu ersetzen. (Wird noch gebaut)
Jetzt der Code.
01.
set header=1 02.
:main 03.
call :zeilencount 04.
call :spaltcount 05.
06.
set y=3 07.
set x=2 08.
09.
call :element %y% %x% 10.
echo %ausa% >> testtt.txt 11.
set /a "ausgabeneu=%ausgabew%+8" 12.
set /a "yoff=%y%+1" 13.
sed "%yoff% s/%ausgabew%/%ausgabeneu%/1" %tabelle% > %output% 14.
15.
goto :eof 16.




