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.
Imports System.Collections.Generic
Imports System.Text.Json
Namespace DataStructure
Public Class Utils
Public Function RemoveDuplicates(table As String) As String
Dim doc As JsonDocument = JsonDocument.Parse(table)
Dim seen As New HashSet(Of String)()
Dim uniqueElements As New List(Of JsonElement)()
For Each element As JsonElement _
In doc.RootElement.EnumerateArray()
' Serialize each element to a canonical string for comparison
Dim key As String = element.GetRawText()
If seen.Add(key) Then
uniqueElements.Add(element)
End If
Next
Return JsonSerializer.Serialize(uniqueElements)
End Function
End Class
End Namespace
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.