Beim Zusammenführen von Daten aus verschiedenen Quellen können doppelte Einträge entstehen, die vor der Weiterverarbeitung bereinigt werden sollen. Diese Lektion zeigt, wie eine Tabelle per JSON an eine .NET-Funktion übergeben, dort von Duplikaten befreit und das Ergebnis als saubere Tabelle zurückgeladen wird. Als zweites Thema wird gezeigt, wie mit process appendTable und dem Befehl AppendRow Tabellenzeilen direkt per Hilfsskript eingefügt werden, ohne JSON-Strings manuell aufzubauen.

1. Die Bildschirmmaske

Das Script definiert zwei Tabellen: sampletable mit den Ausgangsdaten (enthält absichtlich Duplikate) und cleantable für das bereinigte Ergebnis. Der Pushbutton löst das InputScript rm_duplicate.txt aus.

GuiXT
Table (11,1) (21,65) name="sampletable" title="Beispiele"
Column "Name"  size=20 name="name"
Column "Firma" size=20 name="company"
Column "Rolle" size=20 name="role"

Table (22,1) (32,65) name="cleantable" title="Beispiele (Keine Duplikate)"
Column "Name"  size=20 name="name"
Column "Firma" size=20 name="company"
Column "Rolle" size=20 name="role"

// Testdaten als JSON-Array aufbauen (enthält bewusst Duplikate)
process appendTable V[sampletable] "Alice Johnson" "Acme Corp" "Manager"
process appendTable V[sampletable] "Bob Smith" "TechHub" "Developer"
process appendTable V[sampletable] "Carol White" "BizCo" "Analyst"
process appendTable V[sampletable] "David Lee" "Acme Corp" "Developer"
process appendTable V[sampletable] "Alice Johnson" "Acme Corp" "Manager"
process appendTable V[sampletable] "Eva Martinez" "SoftWave" "Designer"
process appendTable V[sampletable] "Frank Turner" "TechHub" "Analyst"
process appendTable V[sampletable] "Grace Kim" "BizCo" "Manager"
process appendTable V[sampletable] "Henry Brown" "CloudBase" "Developer"
process appendTable V[sampletable] "Bob Smith" "TechHub" "Developer"
process appendTable V[sampletable] "Isabella Clark" "SoftWave" "Developer"
process appendTable V[sampletable] "James Wright" "Acme Corp" "Designer"
process appendTable V[sampletable] "Karen Scott" "CloudBase" "Analyst"
process appendTable V[sampletable] "Liam Harris" "BizCo" "Developer"
process appendTable V[sampletable] "Mia Thompson" "TechHub" "Manager"
process appendTable V[sampletable] "Carol White" "BizCo" "Analyst"
process appendTable V[sampletable] "Noah Davis" "SoftWave" "Analyst"
process appendTable V[sampletable] "Olivia Moore" "CloudBase" "Designer"
process appendTable V[sampletable] "Peter Wilson" "Acme Corp" "Manager"
process appendTable V[sampletable] "Mia Thompson" "TechHub" "Manager"


// Struktur und Tabellenvariable anlegen, dann JSON laden
CreateStructure V[struct] name company role
CreateTable V[sampletable] include=V[struct]
CopyText fromText="table" toTable="V[sampletable]" -json

Pushbutton (21,69) "Entferne Duplikate" process="rm_duplicate.txt"
GuiXT
Parameter table // Tabelle mit den Spalten name company role
Parameter name
Parameter company
Parameter role

CreateStructure V[tablerow] name company role

Set V[tablerow.name] "&V[name]"
Set V[tablerow.company] "&V[company]"
Set V[tablerow.role] "&V[role]"

AppendRow V[tablerow] table=V[table]

Return

1.1 Testdaten mit process appendTable einfügen

Anstatt den JSON-String manuell Zeile für Zeile aufzubauen, wird jede Testzeile mit process appendTable direkt in die Tabelle V[sampletable] eingefügt. Das Schlüsselwort process ruft ein benanntes InputScript auf und übergibt Werte als Parameter – hier die Tabellenvariable als erstes Argument, gefolgt von Name, Firma und Rolle.

Das Hilfsskript process_appendTable.txt empfängt die Werte über Parameter-Anweisungen. Es legt zunächst eine temporäre Struktur V[tablerow] mit den drei Spalten an und befüllt die Felder mit Set. Anschließend fügt AppendRow V[tablerow] table=V[table] die fertige Zeile an die übergebene Tabelle an. Dieser Ansatz ist lesbarer als die manuelle JSON-Konstruktion, da kein Escaping von Anführungszeichen nötig ist.

2. Das InputScript rm_duplicate.txt

Das InputScript legt die Zieltabelle an, übergibt sampletable als JSON an die .NET-Funktion und lädt das bereinigte Ergebnis direkt in cleantable.

GuiXT
CreateStructure V[struct] name company role
CreateTable V[cleantable] include=V[struct]
CallVB cleantable = DataStructure.Utils.RemoveDuplicates "&V[sampletable]"
return

CallVB cleantable = ... serialisiert V[sampletable] automatisch als JSON-Array und übergibt den String an die .NET-Funktion. Der Rückgabewert ist ebenfalls ein JSON-Array, das GuiXT automatisch in die Zieltabelle cleantable lädt. Die Spaltennamen (name, company, role) müssen in beiden Tabellen und im JSON übereinstimmen.

3. Der .NET-Code

Die Funktion RemoveDuplicates empfängt den JSON-Array der Tabelle, entfernt doppelte Einträge und gibt einen bereinigten JSON-Array zurück. Zur Erkennung von Duplikaten wird GetRawText() verwendet, das den exakten JSON-Text jedes Elements liefert. Zwei Elemente gelten als identisch, wenn ihr JSON-Text zeichengenau übereinstimmt. Ein HashSet<string> merkt sich alle bereits gesehenen Texte. Die Methode HashSet.Add() gibt true zurück, wenn der Wert neu war, und false, wenn er bereits enthalten war. Nur neue Einträge werden in die Ergebnisliste übernommen.

using System.Collections.Generic;
using System.Text.Json;

namespace DataStructure
{
    public class Utils
    {
        public string RemoveDuplicates(string table)
        {
            JsonDocument doc = JsonDocument.Parse(table);

            var seen = new HashSet<string>();
            var uniqueElements = new List<JsonElement>();

            foreach (JsonElement element in doc.RootElement.EnumerateArray())
            {
                // Serialize each element to a canonical string for comparison
                string key = element.GetRawText();

                if (seen.Add(key))
                {
                    uniqueElements.Add(element);
                }
            }

            return JsonSerializer.Serialize(uniqueElements);
        }
    }
}

Wichtig: Da GetRawText() den JSON-Text zeichengenau vergleicht, müssen zwei Einträge exakt gleich formatiert sein, damit sie als Duplikate erkannt werden. Da GuiXT V[sampletable] beim CallVB-Aufruf automatisch als JSON-Array serialisiert, ist das Format stets konsistent – und damit die Duplikaterkennung zuverlässig.

Duplikat-Skripte herunterladen (ZIP)