In Tabellen rumrechnen mittels Batch;Elemente finden und Ersetzen (Teil 1)

Mitglied: gogoflash

gogoflash (Level 2) - Jetzt verbinden

23.05.2006 um 13:33 Uhr, 18667 Aufrufe

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,Sed . Hinweise, Kritik und Bemerkungen sind willkommen.

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 den 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.Addieren von Strings natürlich nicht.

Anmerkung:
Es ist nicht Ziel dieses Tutorials den Leser in die tiefsten Abgründe von MS Batch zu führen, was nur sehr wenigen vergönt ist, sondern anhand der obengenannten Problematik, Stategien und Tools vorzustellen, wie man die tabellenorientierte Infos (zb auch Eventlog) bearbeiten kann.

Für Diskussionen und neue Codeschnipsel ist der Beitrag:
https://www.administrator.de/wissen/in-tabellen-rumrechnen-mittels-batch ...
vorgesehen. Dort entwickelt sich der zweite Teil und Beta Versionen.

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.



for /L %%c IN (1,1,%tspalt%) DO (for /L %%d IN (1,1,%tzeile%) DO echo %%c %%d >> test.txt)
</code>

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.

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

Erkenntnis: %%a ist der Wert in der Zelle.
%%c Spaltencounter
%%d Zeilencounter


Gibt uns aus:

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

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.


Frage: In welcher Spalte/Zeile 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. Also mit einzelnem Auslesen jedes Elements.

  1. Tabelle benötigt einen künstlichen Header von einer Zeile. Da die erste Zeile ignoriert wird, weil SKIP in der FOR Schleife mit dem Wert Null nichts anfangen kann.
  2. Der Wert wird exakt gesucht. ZB 2020 und "Farbe 20" werden ignoriert.
  3. Wird nichts gefunden, so werden keine Daten ausgegeben in die Farben.txt
  4. Zwischen den Semikolons muss zwingend ein Wert stehen. ;; ist nicht zulässig.
  5. Werte können mehrfach in der Tabelle auftauchen.

Ausgabe:
Wert 20 in Zeile 1 Spalte 2



Mittels. Head,cut.tail ?


Hier eine nette Fassung, die direkt die Elemente anspringt. 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.

Frage: Welcher Wert enthält Spalte 2, Zeile 1 ?


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.

Welcher Wert enthält Spalte 2, Zeile 1 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.

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önnten, damit können wir an das Skript einfach eine Tabelle übergegen und der Rest wird vom Skript erledigt.

Idee. Mit Findstr werden die 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.
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.) (Very Dirty)


Spalten und Zeilenzahl mit Cut;head,Tail.


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 ???



Alles zusammen in einem Skript



Anwendung und weitere Beispiele.


Frage: Element: 1 Zeile und 2 Spalte plus Element: 2 Zeile und 1 Spalte



Frage: Summe der Elemente in der ersten Spalte


ohne Kommentar.

Frage: Summe der Elemente in der ersten Zeile


ohne Kommentar.


Suchen eines Elementes in der ersten Spalte **


Wir schränken die Suche auf eine bestimmte Zeile ein.


Addiere 8 auf den Wert in der zweiten Spalte und zweiten Zeile und schreibe Ihn in die Tabelle


Hierfür wird sed benutzt.
(Quelle und Anleitung: http://www.student.northpark.edu/pemente/sed/sedfaq.html )

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.

Eine Verfeinerung und Verbesserung der bisherigen Ergebnisse werden bei bedarf und Interesse im zweiten Teil durchgekaut.

Ich hoffe ein bischen von den Möglichkeiten von Batch aufgezeigt zu haben und die Benutzung von Tools nähergebracht zu haben.

In allen Codeschnipseln steckt bestimmt noch eine Menge Entwicklungspotential, mit den Entsprechnende Ideen und Werkzeugen läßt sich bestimmt noch mehr rausholen. (Mal den Batch Biber fragen).


Gruß Miguel
Heiß diskutierte Inhalte
LAN, WAN, Wireless
Allgemeiner Fehler
gelöst jensgebkenFrageLAN, WAN, Wireless16 Kommentare

Hallo Gemeinschaft, habe bei einem PC folgendes Ping Problem über ipconfig erhalte ich die IP 192.168.178.37 will ich diesen ...

Microsoft
Die letzte Phase des Desktop Kriegs?
FrankInformationMicrosoft16 Kommentare

In seinem Blog vertritt Eric S. Raymond, bekannt auch unter seinem Hacker-Namen ESR, eine interessante Theorie um das Ende ...

Windows Userverwaltung
Powershell nach Gruppe und deren Mitglieder suchen
gelöst 145963FrageWindows Userverwaltung12 Kommentare

Hallo Admin' s, hier mein Object in der Active Directory. Wie kann ich jetzt gezielt nach der Gruppe "OU=Verwaltung" ...

Ubuntu
Server Bash Input Output error
gelöst DerEchteBoenFrageUbuntu12 Kommentare

Guten Tag Leute! Ich hab letztens einen älteren Hp Server mit 2x Intel Xeon mit jeweils 6 kernen und ...

Microsoft
Gespeichertes Eventlog per Powershell durchsuchen
gelöst DerWoWussteFrageMicrosoft12 Kommentare

Werte Kollegen! Ich archiviere die Securitylogs des Domänencontrollers jeden Tag. Wenn ich nun etwas im Log von z.B. vorgestern ...

Windows Userverwaltung
Active Directory Gruppen auslesen
gelöst MMaiwaldFrageWindows Userverwaltung12 Kommentare

Guten Abend, ich habe mir das Codeschnipsel geschnappt und möchte dieses noch erweitern. Dazu möchte ich noch die Beschreibung ...

Ähnliche Inhalte
Administrator.de Feedback

Entwicklertagebuch: Hauptmenü überarbeitet (Teil 2) und der Bereich Links wird eingestellt

admtechInformationAdministrator.de Feedback29 Kommentare

Hallo Administrator User, mit dem Release 5.6.1 haben wir unser Hauptmenü (das große Blaue ganz oben) nochmal etwas überarbeitet. ...

Humor (lol)

Facebook wird ab 1. Mai kostenpflichtig

BassFishFoxInformationHumor (lol)11 Kommentare

Washington (dpo) - Bekommt Facebook so sein Problem mit Fake-News und Datenmissbrauch in den Griff? Wie der Gründer und ...

Off Topic

Sachen die die Welt nicht braucht - Platz 1

brammerTippOff Topic21 Kommentare

Hallo, ich habs als Tipp angelegt als Erfahrungsbericht nein Danke brammer

Windows Netzwerk

Securing Privileged Access for the AD Admin - Part 1

133883InformationWindows Netzwerk1 Kommentar

Sollte jeder AD Admin in seinem Repertoire haben. Separate Admin-Accounts für exakt definierte Aufgaben und Administrations-Bereiche. Folgende Artikelserie nimmt ...

Batch & Shell

Batch Übung zum Desktop Switchen

TechnoXAnleitungBatch & Shell7 Kommentare

Guten Tag, für mich war es eine Trainingsübung. Da ich mich fragte - wie kann ich meine Icons auf ...

Batch & Shell

Batch zum Zurücksetzen eines lokalen Profils

Mr.ErrorTippBatch & Shell

Ahoi! Mir ist in diesem Forum schon sehr oft geholfen worden und daher wollte ich auch mal was zurück ...

Berechtigungs- und IdentitätsmanagementBerechtigungs- und IdentitätsmanagementWebdienste und -serverWebdienste und -serverDatenbankenDatenbankenMonitoring & SupportMonitoring & SupportHybrid CloudHybrid CloudSmall Business ITSmall Business IT