CSVfox
Get the job done.
 Deutsch

Bedingungen für Filterung und Befehle

Bedingungen für das Filtern und Ausführen von Befehlen

Es gibt zwei Anwendungsbereiche für die Verwendung von Bedingungen:

  • Als Kriterium zum Filtern von Datenzeilen bei der Eingabe oder Ausgabe, siehe ±filter.
  • Als Voraussetzung für die Ausführung von Befehlen, siehe ±if/else.

Alle Filterungen und Bedingungsauswertungen sind feldbasiert. Sie erfolgt zeilenweise entsprechend der allgemeinen Arbeitsweise von CSVfox und basiert immer auf den aktuellen Daten der aktuellen Zeile.

Die Auswertung wird meist durch einen Vergleich von zwei Operanden beschrieben. Gelegentlich wird nur einer getestet (ob er leer ist), oder es werden mehrere benötigt (für einen Bereichsausdruck).

Auswertungsmodi für Filter und Bedingungen

Im Allgemeinen erfolgt die Auswertung von Bedingungen entweder im numerischen Modus oder im Textmodus (String). Welcher Modus verwendet wird, wird durch den linken Operanden bestimmt: runde Klammern oder eine Zahl deuten auf eine numerische Operation hin, andernfalls wird eine String-Operation durchgeführt.

Zusätzlich gibt es einige Modus-Parameter für die Art und Weise, wie die Auswertung erfolgen soll:
/n erzwingt eine numerische Auswertung der Operanden
/a erzwingt eine stringartige Auswertung der Operanden
/i nur für Strings: Groß-/Kleinschreibung ignorieren
/c nur für Strings: kulturabhängiger Vergleich von Strings verwenden

Beispiele

Einige Beispiele für Filter

+filter(#)>(3)
Liest die aktuelle Datenzeile nur, wenn die Nummer der Eingabezeile größer als 3 ist.
D.h., die ersten drei Zeilen der Eingabedatei werden ausgelassen.
+filter[3]
Liest und verarbeitet diese Datenzeile nur, wenn die dritte Spalte nicht leer ist.
-filter[Status]!={Locked}
Gibt die aktuelle Datenzeile nur aus, wenn die Spalte "Status" nicht gleich dem Text "Gesperrt" ist.
-filter/i[Fruit]={Apple}/{Pear}
Gibt die aktuelle Datenzeile nur aus, wenn der Text in der Spalte "Obst" entweder "Apfel" oder "Birne" oder einen gleichwertigen Text unabhängig von der Groß- oder Kleinschreibung enthält.
-filter(NumericExpression1)>(NumericExpression2)
Gibt die aktuelle Datenzeile nur aus, wenn NumericExpression1 größer ist als NumericExpression2.
"NumericExpression1" und "NumericExpression2" werden vor dem Vergleich berechnet.

Einige Beispiele für bedingte Befehle

-if["Not in Navigation"]=Yes//set[*]=1//else//set[*]=0
Wenn das Feld "Nicht in der Navigation" den Wert "Ja" enthält, setzt es auf "1", sonst auf "0".
-if[ThisField]={Expression}//set[ThatField]=Yesvalue//else//set[ThatField]=Novalue
Fügt in die Spalte [ThatField] entweder "Yesvalue" oder "Novalue" ein, wenn die Spalte [ThisField] mit "Expression" übereinstimmt, andernfalls nicht.
"Ausdruck", "JaWert" und "NeuWert" werden aufgelöst. Zu den Bedingungen siehe unten.
-if(NumericExpression1)>=(NumericExpression2)//set[Field]=1//else//set[Field]=2
In Spalte [Feld] wird entweder "JaWert" oder "NeuWert" eingefügt, wenn "Ausdruck1" größer oder gleich "Ausdruck2" ist, andernfalls nicht.
"Expression1", "Expression2", "Yesvalue" und "Novalue" werden aufgelöst.

Bedingungsoperanden

Operanden

Ein Operand kann ein einzelnes literales CSV Feld [Feld], ein numerisches CSV Feld ([Feld]), ein numerischer Ausdruck oder eine Formel (Ausdruck) oder ein literaler String oder ein Ausdruck {Ausdruck} sein.
Der linke Operand wird also immer von einer Klammer umgeben.
Der/die rechte(n) Operand(en) benötigen die geschweiften Klammern {Ausdruck} nicht.
Bevor die Bedingung ausgewertet wird, werden alle Felder durch ihre tatsächlichen Werte ersetzt, alle Formeln berechnet und alle Ausdrücke aufgelöst. Für Details siehe auch Ausdrücke

In der folgenden Tabelle steht "{Opn}" für einen beliebigen Operanden, sei es ein einzelnes Feld, ein numerischer Wert, eine Zeichenkette oder ein Ausdruck.
Der linke Operand ist immer ein einzelner Operand, während es auf der rechten Seite mehrere Operanden geben kann (siehe unten).
{Op} = linker Operand
{Op1} = erster rechter Operand
{Op2} = weiterer rechter Operand ...

Tabelle der Bedingungsoperatoren

Verfügbare Bedingungsoperatoren

Funktion Operator Alternative
Operator
Zeichenkette Numerisch Anzahl von
Rechten Operanden
Syntax
{Op} nicht leer 0 {Op}
{Op} leer ! n: 0 {Op}!
{Op} ist null % u: 0 {Op}%
{Op} gleich {Op1} = e: 1 * {Op}={Op1}
{Op} größer als {Op1} > g: 1 * {Op}>{Op1}
{Op}kleiner als {Op1} < l: 1 * {Op}<{Op1}
{Op} größer oder gleich {Op1} >= ge: 1 * {Op}>={Op1}
{Op} kleiner oder gleich {Op1} <= le: 1 * {Op}<={Op1}
{Op} beginnt mit {Op1} <# b: 1 * {Op}<#{Op1}
{Op} endet mit {Op1} #> f: 1 * {Op}#>{Op1}
{Op} enthält {Op1} <#> c: 1 * {Op}<#>{Op1}
{Op} reguläre Treffer {Op1} @ r: 1 * {Op}@{Op1}
{Op} größer als {Op1},
und kleiner als {Op2}
<> gl: 2 {Op}<>{Op1}/{Op2}
{Op} größer/gleich {Op1},
und kleiner/gleich {Op2}
<=> gel: 2 {Op}<=>{Op1}/{Op2}
{Op}kleiner als {Op1},
oder größer als {Op2}
>< lg: 2 {Op}><{Op1}/{Op2}
{Op} kleiner/gleich {Op1},
oder größer/gleich {Op2}
>=< leg: 2 {Op}>=<{Op1}/{Op2}

* weitere Operanden können verwendet werden, wenn sie mit Begrenzern verkettet werden, siehe unten

Wie Sie sehen, gibt es für jede Bedingung zwei verschiedene Operatoren, die Standardform und die alternative, alphabetische Form.

Beide Operatoren bewirken das Gleiche. Während die Standardform vielleicht besser lesbar und unverwechselbar ist, kann die Verwendung der alphabetischen Version notwendig sein, z.B. wenn die Befehle direkt in die Befehlszeile eingegeben werden und der Befehlsprozessor dazu neigt, das Vergleichszeichen, wie das "<" und das ">", falsch zu interpretieren.

Negation

Alle Operatoren können auch in negierter Form verwendet werden.
Die Negation wird ausgedrückt, indem ein "!" oder ein "n" vor den Operator gesetzt wird.
So bedeutet "=" oder "e:" "gleich", während "!=" oder "!e:" "nicht gleich" oder "ungleich" bedeutet (ebenso wie "n=" oder "ne:", Sie können die Varianten mischen).

In vielen Fällen ist ein negierter Operator gleichbedeutend mit einem anderen nicht-negierten Operator.
So ist die Negation von ">" (größer) "!>" (nicht größer), was gleichbedeutend mit "<=" (kleiner oder gleich) ist.

Dies gilt jedoch nicht für die literalen Operatoren "b:" (beginnt mit), "c:" (enthält) und "f:" (endet mit); hier bedeutet die Negation "!b:" oder "nb:" "Zeichenkette beginnt nicht mit", "!c:" oder "nc:" bedeutet "Zeichenkette enthält nicht" und "!f:" oder "nf:" bedeutet "Zeichenkette endet nicht mit".
Auch die reguläre Übereinstimmung "r:" kann mit "nr:" oder "!@" (oder mit einer Mischung aus beidem) negiert werden, was dann "Zeichenkette stimmt nicht mit dem regulären Ausdruck überein" bedeutet.

Es gibt jedoch noch einen wichtigen Unterschied, wenn es um mehr als einen Operanden auf der rechten Seite geht.

Verkettete rechte Operanden

Für alle Bedingungen, die einen rechten Operanden erfordern, kann stattdessen eine Operandenliste verwendet werden. Eine Operandenliste besteht aus mehreren Operanden, die mit einem einzigen Begrenzungszeichen (in der Regel ein "/") verkettet sind.

In diesem Fall wird die Bedingung mit potentiell jedem dieser rechten Operanden ausgewertet, einer nach dem anderen.
Es gelten die folgenden Regeln:

  • Bei einer einfachen, nicht-negierten Bedingung werden mehrere rechte Operanden ODER-verknüpft. Das heißt, wenn mindestens einer der rechten Operanden die Auswertung wahr sein lässt, wird die gesamte Bedingung zu wahr aufgelöst.

  • Bei einer negierten Bedingung werden mehrere rechte Operanden UND-verknüpft. Das bedeutet, dass die gesamte Bedingung nur dann wahr wird, wenn alle rechten Operanden die Auswertung wahr werden lassen.

Beachten Sie den Unterschied und wie Sie ihn für Ihre Zwecke nutzen können.

Ein Beispiel mit der numerischen Filterbedingung "Kleiner als":
-filter([Nnn])<([A]) Einfache Bedingung mit einem rechten Operanden:
Der numerische Wert von Feld [Nnn] ist kleiner als der numerische Wert von Feld [A].
-filter([Nnn])<([A])/([B])/([C]) Einfache Bedingung mit mehreren rechten Operanden:
Feld [Nnn] ist numerisch kleiner als Feld [A] oder kleiner als Feld [B] oder kleiner als Feld [C].
-filter[Nnn]!>=([A]) Negierte Bedingung mit einem rechten Operanden:
Der numerische Wert von Feld [Nnn] ist nicht größer oder gleich, d.h. er ist auch kleiner als Feld [A].
-filter([Nnn])!>=([A])/([B])/([C]) Negierte Bedingung mit mehreren rechten Operanden:
[Nnn] ist numerisch kleiner als das Feld [A] und auch kleiner als das Feld [B] und auch kleiner als das Feld [C].

Ein weiteres Beispiel mit der String-Filterbedingung "enthält":
-filter[Xyz]c:abc Einfache Bedingung mit einem rechten Operanden:
Das Feld [Xyz] enthält das Literal "abc".
-filter[Xyz]c:abc/def/ghi Einfache Bedingung mit mehreren rechten Operanden:
Feld [Xyz] enthält "abc" oder "def" oder "ghi".
-filter[Xyz]nc:abc Negierte Bedingung mit einem rechten Operanden:
Feld [Xyz] enthält nicht das Literal "abc".
-filter[Xyz]nc:abc/def/ghi Negierte Bedingung mit mehreren rechten Operanden:
Feld [Xyz] enthält nicht "abc" und auch nicht "def" und auch nicht "ghi"
(d.h. weder "abc" noch "def" noch "ghi").
filter/:[Xyz]!c:abc:def:ghi Dasselbe wie oben, aber mit einem geänderten Trennzeichen (":" statt "/").
Zwar sieht das ":" des Operators jetzt wie das Trennzeichen ":" aus, aber das ist kein wirkliches Problem.

Wenn es einen "leeren" Operanden gibt, müssen Sie ihn an den Anfang oder an das Ende stellen, so dass die Liste der Operanden mit einem Begrenzungszeichen zu beginnen oder zu enden scheint. Setzen Sie ihn nicht zwischen Begrenzungszeichen, denn das wird als doppeltes Begrenzungszeichen interpretiert, das den Beginn der nächsten Bedingung oder des nächsten Befehls markiert.

Vergessen Sie auch nicht, alle Klammern, die nicht grammatikalischer Bestandteil eines Feldbezeichners, einer Formel oder eines Formatierungsausdrucks sind, zu "escapen", d.h. alle literalen (, ), [, ], {, }, <, > Zeichen durch \(, \), \[, \], \{, }, \<, oder \> zu ersetzen.

Groß- und Kleinschreibung bei Zeichenketten

Für den Vergleich von Zeichenketten ohne Berücksichtigung der Groß-/Kleinschreibung kann der Modus "i" verwendet werden:

-filter[Feld]={Ausdruck} [Feld] und {Ausdruck} sind gleich.
-filter/i[Feld]={Ausdruck} [Feld] und {Ausdruck} werden als gleich angesehen, aber beim Vergleich wird nicht zwischen Groß- und Kleinschreibung unterschieden.
-filter[Feld]!=[Anderes Feld] [Feld] und [Anderes Feld] sind nicht gleich.
-filter/i[Feld]!=[Anderes Feld] [Feld] und [Anderes Feld] sind nicht gleich, auch wenn der Vergleich die Groß- und Kleinschreibung ignoriert (d.h. nicht zwischen Groß- und Kleinschreibung unterscheidet).
Under construction, coming soon