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 Funktionsweise von CSVfox und basiert immer auf den aktuellen Daten der aktuellen Zeile.
Einige Filterbeispiele
- +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]!={Gesperrt}
- Gibt die aktuelle Datenzeile nur aus, wenn die Spalte "Status" nicht gleich dem Text "Gesperrt" ist.
- -filter[Fruit]={Apple}/{Pear}
- Gibt die aktuelle Datenzeile nur aus, wenn der Text in der Spalte "Obst" entweder "Apfel" oder "Birne" ist.
- -filter(NumerischerAusdruck1)>(NumerischerAusdruck2)
- Gibt die aktuelle Datenzeile nur aus, wenn NumericExpression1 größer ist als NumericExpression2.
"NumerischerAusdruck1" und "NumerischerAusdruck2" werden vor dem Vergleich berechnet.
Einige Beispiele für bedingte Befehle
- -if["Nicht in der Navigation"]=Ja//set[*]=1//else//set[*]=0
- Wenn das Feld "Nicht in der Navigation" den Wert "Ja" enthält, wird es auf "1" gesetzt, ansonsten auf "0".
- -if[DiesesFeld]={Ausdruck}//set[DiesesFeld]=JaWert//else//set[DiesesFeld]=Novalue
- Fügt in Spalte [ThatField] entweder "JaWert" oder "NeuWert" ein, wenn Spalte [ThisField] mit "Ausdruck" übereinstimmt, andernfalls.
"Ausdruck", "JaWert" und "NeuWert" werden aufgelöst. Für die Bedingungen siehe unten. - -if(NumerischerAusdruck1)>=(NumerischerAusdruck2)//set[Feld]=1//else//set[Feld]=2
- In der Spalte [Feld] wird entweder "JaWert" oder "NeuWert" eingefügt, wenn "Ausdruck1" größer oder gleich "Ausdruck2" ist, andernfalls nicht.
"Ausdruck1", "Ausdruck2", "JaWert" und "NeuWert" werden aufgelöst.
Bedingungsoperanden und Operatoren
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 ...
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} 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} | >= | ✓ | ✓ | 1 * | {Op}>={Op1} | |
{Op} kleiner oder gleich {Op1} | <= | ✓ | ✓ | 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} |
<> | ✓ | 2 | {Op}<>{Op1}/{Op2} | ||
{Op} größer/gleich {Op1}, und kleiner/gleich {Op2} |
<=> | ✓ | 2 | {Op}<=>{Op1}/{Op2} | ||
{Op}kleiner als {Op1}, oder größer als {Op2} |
>< | ✓ | 2 | {Op}><{Op1}/{Op2} | ||
{Op} kleiner/gleich {Op1}, oder größer/gleich {Op2} |
>=< | ✓ | 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]!c: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 "/"); Das ":" des Operators sieht zwar 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 setzen, 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
Groß- und Kleinschreibung bei Zeichenketten
Für den Vergleich von Zeichenketten ohne Berücksichtigung der Groß- und Kleinschreibung kann der Modus "i" auf zwei Arten angewendet werden:
-filter[Feld]={Ausdruck} | [Feld] und {Ausdruck} sind gleich. |
-filter/i[Feld]={Ausdruck} -filter[Feld]i={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] -filter Feld]!i=[Anderes Feld] |
[Feld] und [Anderes Feld] sind nicht gleich, der Vergleich unterscheidet nicht zwischen Groß- und Kleinschreibung. |