Jump to content

Variablen einer großen Tabelle auslesen und wieder einlesen


jloos

Empfohlene Beiträge

Hallo,

kann ich eine umfangreiche Tabelle auslesen, zwischenspeichern und wieder einlesen? 
Grund: Wenn ich Fahrstraßen verändere, auch wenn es nur das versetzen eines Gleiskontaktes ist, dann wird die Fahrstraße ungültig. Ich muss sie neu festlegen. Meine Fahrstraße ist aber in einer Tabelle hinterlegt, um aus der Abfragestelle und der Lok-Nr. die nächste Fahrstraße zu bestimmen. Diese Datenbank ist schon sehr umfangreich. Eine Fahrstraße kann 20 mal in der Datenbank stehen, die ich alle wieder von Hand nachpflegen muss. 
Ich würde mir gerne die Arbeit ersparen und die Tabelle sichern, bevor ich Änderungen an den Fahrstraßen vornehme um sie hinterher wieder einzuspielen.
Ein kleines Lua-Script vielleicht?  
Es handelt sich um die Anlage, die ich hier vorgestellt habe: https://community.3d-modellbahn.de/applications/core/interface/file/attachment.php?id=55119

Gruß Jürgen

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb jloos:

Ein kleines Lua-Script vielleicht?

Hallo Jürgen,

um über alle Elemente einer Tabelle zu iterieren, gibt es in Lua die Schleife for k, v in pairs(t) do

k und v können beliebige Variablennamen sein. Die beiden Buchstaben weisen darauf hin, dass die erste Variable den key (= Bezeichner oder Index) der Zelle erhält und die zweite Variable den value (= Wert oder Inhalt).

Beatles = {"John", "Paul", "George", "Ringo"}

for platz, inhalt in pairs(Beatles) do
  print("an Platz "..platz.." steht: "..inhalt)
end

Beachte bitte, dass in pairs() die Tabelle nicht sortiert durchläuft!
Dafür findet es aber alles, was in der Tabelle steht, egal ob die Zellen durchnummeriert sind oder Namen haben.

Für das sortierte Auslesen einer Tabelle mit lückenlos durchnummerierten Plätzen (sprich: iterable table) gibt es in ipairs().
Das i vor pairs weist auf iterable hin.

Wenn du in der grafischen EV eine Wiederholung einsetzt und dann in Lua umwandelst, findest du im Code diese in pairs() Methode.

Um etwas in eine durchnummerierte Tabelle einzufügen, gibt es die Methode table.insert(table, [index,] value).

Viele Grüße
Götz

Nachtrag: Nach einem flüchtigen Blick auf deine Anlage noch ein wichtiger Hinweis. Lua unterscheidet nicht zwischen Listen und Tabellen. Man kann sogar beides vermischt in einer Tabelle haben. Aber das 3D-Modellbahn Studio unterscheidet beides ganz klar! Weil sein Code nicht auf Lua basiert. Du hast deine Fahrstraßen in einer Tabelle gespeichert. Das erkennt man sofort daran, dass in der Liste nach Platz 1 der Platz 10 folgt. Diese Zahlen sind bei einer Tabelle Bezeichner. Also Strings und keine Nummern! Und sie werden somit auch unter Lua wie Bezeichner behandelt.

Besser wäre, du würdest die Fahrstraßen in einer Liste ablegen.

Bearbeitet von Goetz
Ergänzungen
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 29 Minuten schrieb Goetz:

Besser wäre, du würdest die Fahrstraßen in einer Liste ablegen.

Oh guter Hinweis. Ich fange grade eine neue Anlage an, die erste war nur Übung. Dann werde ich das gleich berücksichtigen.
Wenn ich wieder eine gut gefüllte Datenbank habe, werde ich wohl noch mal auf das Auslesen zurück kommen :-)

Danke Goetz

Gruß Jürgen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

vor 9 Stunden schrieb jloos:

Ich muss sie neu festlegen.

wie gehst du hier vor? Wenn du nur die Wegpunkte aktualisierst, bleiben die interne ID der Fahrstraße erhalten und somit auch alle Referenzen. Nur wenn du die Fahrstraße löschst und eine neue erstellst, musst du auch Referenzen aktualisieren.

Viele Grüße,

Neo

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Minuten schrieb Neo:

Wenn du nur die Wegpunkte aktualisierst, bleiben die interne ID der Fahrstraße erhalten

wenn ich Beginn oder Ende der Fahrstraße durch Verschieben des Signals ändere, wird die Fahrstraße ungültig. Die Aufforderung, aktualisieren sie die Wegpunkte verstehe ich nicht. Was muß ich tun um die Wegpunkte zu aktualisieren?

Gruß Jürgen

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb jloos:

Was muß ich tun um die Wegpunkte zu aktualisieren?

Klick auf das Stift Icon.
Das führt dich in das Menü, in dem du die Wegpunkte angibst. Dort klickst du einfach auf "Übernehmen"

1230580274_Fahrstrasseaktualisieren.jpg.4f3edd9b114408b091b59a9c26ee366a.jpg

Bearbeitet von Goetz
Bild hinzugefügt
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Goetz:

Besser wäre, du würdest die Fahrstraßen in einer Liste ablegen.

meine Abfrage ist ja die Variable "AbfragestellenNr." im Gleiskontakt und als Indes die Variable "Lok-Nr." aus der Lok.  Die Abfragestelle ist die Tabelle, in dieser suche ich dann als Index die Lok-Nr.  Bei einer Liste könnte ich keine Lok-Nr. abfragen, denn es kommen ja nicht alle Loks an der Abfragestelle vorbei. Sonst müsste ich  zu jeder Abfragestelle alle Loknummern eintragen und nur die tatsächlich verwendeten Lok-Nr. mit der Fahrstrasse belegen.

vor 17 Minuten schrieb Goetz:

Das führt dich in das Menü, in dem du die Wegpunkte angibst. Dort klickst du einfach auf "Übernehmen"

ja, das funktioniert,  danke

Gruß Jürgen

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb jloos:

meine Abfrage ist ja die Variable "AbfragestellenNr." im Gleiskontakt und als Indes die Variable "Lok-Nr." aus der Lok.

Dann ist die Tabelle mit den Nummern als Bezeichner der richtige Weg.
Tut mir leid, Jürgen ... so im Detail hatte ich deine Anlage nicht studiert.

Gruß
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich komme noch mal auf das Thema Datenbank anlegen zurück. Dafür habe ich ein Beispiel angehängt.

Für die untere Gleistrecke habe ich die Tabelle Fahrstraße mit der Abfragestelle "01" als Tabelle und der Lok-Nr  "05" vom Typ Fahrstraße mit der Fahrstraße 01.11 per EV angelegt. 

Nun habe ich aber sehr viele Fahrstraßen mit 20 Loks. Alle Fahrstraßen sind angelegt, jetzt muss ich nur die Datenbank anlegen, das möchte ich per Tool machen. Dafür habe ich hier im Beispiel  für die obere Gleisstrecke ein Ereignis  "Schalter wird betätigt" angelegt. Doch es legt mir die Datenbank nicht so an, wie es sein soll.

Ich stelle mir vor, das per Lua zu machen, indem ich nur die Daten austausche.

Was mache ich falsch?

Danke für Eure Hilfe

Jürgen

Datenbank per EV.mbp

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...
Am 19.11.2021 um 08:13 schrieb Goetz:

Hallo Jürgen,

um über alle Elemente einer Tabelle zu iterieren, gibt es in Lua die Schleife for k, v in pairs(t) do

k und v können beliebige Variablennamen sein. Die beiden Buchstaben weisen darauf hin, dass die erste Variable den key (= Bezeichner oder Index) der Zelle erhält und die zweite Variable den value (= Wert oder Inhalt).

Hallo Götz,

ich bin inzwischen in meinen Daten verloren. Meine Fahrstraßendatenbank hat inzwischen 41 Tabellen mit insgesamt 207 Fahrstraßeneinträgen.  Ich habe mich immer bemüht den aktuellen Stand in einer Exceltabelle zu dokumentieren.  Doch das läuft immer wieder auseinander :-(

Ein nettes Tool wäre, solch eine Datenbank vollständig im csv-Format  ausgeben zu können um damit in Excel oder anderen Programmen zu arbeiten. Ich kann leider kein Lua, deshalb komme ich auch mit den Angaben im Zitat nicht zurecht. 

Vielleicht könntest Du mir mal ein Beispiel programmieren, basierend auf meiner eingestellten Anlage. 

Ich würde mich darüber sehr freuen, 
schöne Adventstage wünsche ich Allen

 

Gruß Jürgen

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Minuten schrieb jloos:

Ich kann leider kein Lua, deshalb komme ich auch mit den Angaben im Zitat nicht zurecht. 

Das tut mir leid, Jürgen.

Da du mich um ein kleines Skript gebeten hattest ging ich davon aus, dass du es verstehen würdest.

Aber wenn du das einfach gehaltene Beispiel mit den Beatles Namen nicht verstehst, dann nützt dir ein Beispiel, basierend auf deiner Anlage auch nichts. Das wäre nur komplizierter. 

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Goetz,

ich habe eben Probleme Dein Beispiel mit den Beatles und deren Gruppenmitglieder auf meinen Fall umzusetzen. Lasse ich Dein Skript auf der Lua Demoseite ablaufen, kommt 

an Platz 1 steht: John
an Platz 2 steht: Paul
an Platz 3 steht: George
an Platz 4 steht: Ringo

raus. Dein Skript funktioniert. 

Aber ich kann es nicht auf meine Situation umsetzen. Die Abhängigkeiten sind:
Fahrstraße = Abfragestelle , Lok-Nr. 

Außerdem ist mir nicht klar, wohin die Ausgabe geschrieben wird.

Aber trotzdem vielen Dank für Deine Hilfe Goetz, vielleicht kommt bei mir noch durch viel Lesen im Forum die Erkenntnis.

Gruß Jürgen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Jürgen,

schau Dir schnell mal dieses Beispiel mit dem Skript von Götz an. Du musst nur das Ereignisprotokoll einblenden. Bei jedem Tastendruck wird das Skript ausgeführt und im Ereignisprotokoll angezeigt.....

E5D00493-4C13-4C66-BE3F-D2077F91A38E

Gruß Frank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Jürgen,

vor einer Stunde schrieb jloos:

Dein Skript funktioniert.

Wenn du nur sehen kannst, dass es funktioniert, aber nicht wie es funktioniert, dann nützt das alles nichts.

Das Skript ist so klein und überschaubar, dass du wirklich den kompletten Mechanismus in allen Einzelheiten sehen kannst.
Und wenn du das durchschaust, dann kannst du es auch auf andere Situationen umsetzen. 

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ist kein Quizz, Jürgen.
Kein Ratespiel.

Mit dem folgenden Skript siehst du im Protokollfenster eine Liste all deiner 207 Fahrstraßen und ihren aktuellen Status.

local FS = $("Ereignisse").variables["Fahrstrassen"]
local Status = {"ist nicht aktiv", "ist angefordert", "läuft ein", "ist eingelegt und verriegelt"}
local Muster = "Fahrstraße %s %s"

for index1, value1 in ipairs(FS) do
  for index2, value2 in ipairs(value1) do
    local Name = value2.name
    local Text = Status[value2.state + 1]
    print(Muster:format(Name, Text))
  end
end

Das Beispiel zeigt dir, wie du alle Fahrstraßen aus deiner Tabellenstruktur (mit Untertabellen!) auslesen kannst.
Aber ich fürchte, das wird dir auch nicht weiterhelfen. 

In eine Excel Tabelle kann ich die Daten nicht wandeln. Das lässt das Studio nicht zu. Die Gefahr des Missbrauchs wäre zu hoch.

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Götz,

sicherlich hast Du da Recht. "Automatisiert" ist das nicht möglich. Es können aber Daten nach Excel mit einigen manuellen Eingriffen übergeben werden:

Daten_nach_Excel1.thumb.JPG.f1e7d2df8b36dcfa140d229f4d6d7b77.JPG

Diese Skript schreibt einige Informationen in das Protokoll (Signal, wartenden Zug falls vorhanden). Das Ergebnis im Protokoll sieht dann so aus:

Daten_nach_Excel2.JPG.9c0d804ae7f181aae842fd4ef0e5f9cd.JPG

Mit der rechten Maustaste kann man die Protokolldaten in eine Textdatei speichern. Mit Excel (hier bei mir OpenOffice) kann man diese Datei laden:

Daten_nach_Excel3.JPG.2a83e6ecb5a666ac651d06cd82f9ddbb.JPG

Das Ergebnis sieht dann so aus:

Daten_nach_Excel4.thumb.JPG.0bf2020a4dc0fc792ede2190549c1e71.JPG

Mit wenigen Befehlen (alle Zeilen löschen, die in Spalte B nicht "Signalbelegung:" beinhalten, ggf. Spalte A und B löschen) hat man das gewünschte Ergebnis in Excel.

Das entspricht nicht den ursprünglichen Anforderungen hier. Aber generell ist es möglich, Daten nach außen zu geben.

Grüße, Wolfgang

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...