48 03_YAML_de
Stephan Geisler edited this page 5 months ago

auto translate: Čeština | 中文简体 | English | Español | Français | Italiano | 한국어 | Nederlands | Polski | Русский


HOME | INSTALLATION | YAML-Regeln | FAQ


Um einfache Suchbegriffe als Tag im Dateinamen hinzuzufügen und entsprechend in Kategorieordner einzusortieren, reichen wahrscheinlich die Möglichkeiten in der GUI.

Beispiel: Tagname_1=Unterordner_X;Tagname_2=Unterordner_Y;Tagname_3;Tagna…

Ist aber ein umfangreicherer Workflow abzubilden, so werden mit einer externen Regeldatei im YAML-Format bessere Möglichkeiten geboten.

Dafür hier die Beschreibung:

allgemeine Hinweise:

• Regelnamen (z.B. rule_01) bestehen nur aus Buchstaben und Zahlen, dürfen aber nicht mit einer Zahl beginnen
• die Reihenfolge der gefunden Tags kann man über die alphabetische Reihenfolge der Regelnamen steuern
• damit die erweiterte Regeldatei als solche erkannt wird muss die nachstehende Zeile enthalten sein:
# synOCR_YAMLRULEFILE
• es ist sehr wichtig, die korrekten Einrückungen einzufügen
• verwende keine Tapstops, sondern nur Leerzeichen!
• Verwende die genaue Anzahl von führenden Leerzeichen, wie im Beispiel gezeigt.
• Die führenden Rautezeichen (#) der Beispielregel gehören nicht zur Syntax, sondern kennzeichnen die Beispielzeilen lediglich als Kommentar.
• Tipp: copy & paste den Musterblock und passe ihn dann an
• verwende keine Windows-Zeilenumbrüche! Tipp: nutze den DSM eigenen Texteditor.
• alle gefundenen Tags werden im Platzhalter §tag in der Rename-Syntax (GUI) bereitgestellt


Wie wird die Regeldatei erstellt? Der schnellste Weg geht über den Button in der GUI. Dabei werden auch bereits 'einfache' Tags aus der GUI in die Regeldatei überführt. Sie wird im Inputordner erstellt. Bestehende 'einfache' Tags werden ebendort in einer Textdatei gesichert. Die Regeldatei lässt sich in jedem Texteditor (Word gehört nicht dazu) bearbeiten (Tipp: verwende den DSM Texteditor aus dem Paketzentrum).


wird zu


BEISPIELE

eine ganz einfache Regel

  • enthält der OCR-Text Apple Inc., so wird der Tag teuer gesetzt:
rule_01:
    tagname: teuer
    condition: any
    subrules:
    - searchstring: Apple Inc.
rule_02:
    tagna...

mehrere Bedingungen

Es können auch mehrere Bedingungen in Unterregeln definiert werden.
Müssen alle erfüllt werden, nur eine oder darf gar keine erfüllt sein, damit die Bedingung 'wahr' ist?
Das definiert der Wert condition:

  • condition: all ➜ alle Unterregeln müssen erfüllt sein
  • condition: any ➜ irgendeine Unterregel muss erfüllt sein
  • condition: none ➜ keine Unterregel darf erfüllt sein

Im nachstehenden Beispiel wird der Tag Obst gesetzt, wenn irgendein Suchwort gefunden wird:

rule_02:
    tagname: Obst
    condition: any
    subrules:
    - searchstring: Apple Inc.
    - searchstring: iPod
    - searchstring: MacBook
rule_03:
    tagna...

Zielordner per Regel definieren

Bei Erfüllung mehrerer Regeln werden platzsparend Hardlinks für alle PDF-Dateien gesetzt, die sich auf dem selben Volume befinden.
Es gibt zwei Möglichkeiten für regelbasierte Zielordner:

  1. Unterordner vom Outputordner
  2. ein absoluter Pfad

Was macht den Unterschied? Die Angabe wird insofern geprüft, ob der Wert mit /volume beginnt. Wenn ja, so wird der Wert als absoluter Pfad interpretiert, wenn nicht, als Unterordner des Outputordners. Ggf. wird versucht, einen fehlenden Ordner zu erstellen.


Die gleichen Variablen wie bei der Umbenennungssyntax können auch im Pfad verwendet werden. Nachstehend wird bei erfüllter Regel die Datei in den Unterordner .../Versicherung/2022-01/ verschoben:

rule_05:
    tagname: Versicherung
    targetfolder: /Versicherung/§yocr4-§mocr/
    condition: any
    subrules:
    - searchstring: Allianz
rule_06:
    tagna...

Suchkriterium via RegEx

Suche mit einem einfachen Muster

Es soll der Tag Unfallversicherung gesetzt werden. Die Angaben in den Dokumenten sind aber nicht immer einheitlich. Mal lautet die Versicherungsnummer 301234569 30 123 456 9 oder manchmal 30.123.456.9.
Das Suchwort Allianz soll auf jeden Fall im Dokument vorkommen (condition: all) und Verschoben wird in den Unterordner /Versicherung/:

rule_05:
    tagname: Unfallversicherung
    targetfolder: /Versicherung/
    condition: all
    subrules:
    - searchstring: 30.?123.?456.?9
      searchtyp: contains
      isRegEx: true
    - searchstring: Allianz
      isRegEx: false
rule_06:
    tagna...

variabler Tag via RegEx

Es soll eine Zeichenfolge als Tag verwendet werden, welche selbst im Voraus noch nicht, aber deren Muster bekannt ist, bzw. die sich immer ändert.
Dazu gibt es den Parameter tagname_RegEx. Falls das Suchmuster für tagname_RegEx nichts findet, aber die Regel aufgrund der Unterregeln erfüllt ist, greift tagname: als fall back. Um das abzufangen, sollte auch die Unterregel per RegEx gesucht werden - mehr dazu HIER.

Das nachstehende Beispiel findet und setzt den Tag HUK24 HUK25 ... sofern Coburg im Text gefunden wird:

rule_03:
    tagname: FallBackName
    tagname_RegEx: "HUK[[:digit:]]{2}"
    condition: any
    subrules:
    - searchstring: Coburg
rule_04:
    tagna...

Für den Fall, dass tagname_RegEx mit einem Festen Wert kombiniert werden soll, kann man den Fund aus tagname_RegEx als Platzhalter in tagname verwenden:

rule_03:
    tagname: fixer Text §tagname_RegEx
    tagname_RegEx: "HUK[[:digit:]]{2}"
    condition: any
    subrules:
    - searchstring: Coburg
rule_04:
    tagna...

Suche vor, oder nach einem bekannten Muster

Mit RegEx sind viele komplexe Suchvorgänge umsetzbar. Hier noch ein Beispiel mit lookahead / lookbehind.
Ein regelmäßig zu verarbeitendes Dokument der Gewinnmanufaktur enthält eine Vorgangsnummer, nach welcher die Dokumente einsortiert werden sollen. Zusätzlich soll diese Vorgangsnummer auch als Tag im Dateinamen gesetzt werden. Allerdings ist im voraus nicht bekannt, nach welchen Vorgangsnummern in Zukunft gesucht werden soll. Folgendes Muster ist aber immer gegeben: Vorgangsnummer: 0815.


Mit dieser Regel ist das umsetzbar:

rule_06:
    tagname: Vorgang_k.A.
    tagname_RegEx: (?<=(^Vorgangsnummer[:|;][\s]{1}){1})[0-9]+
    targetfolder: /Vorgänge Gewinnmanufaktur/
    condition: all
    subrules:
    - searchstring: (?<=(^Vorgangsnummer[:|;][\s]{1}){1})[0-9]+
      searchtyp: contains
      isRegEx: true
    - searchstring: Gewinnmanufaktur
      isRegEx: false
rule_07:
    tagna...
  • Da Doppelpunkte von OCR auch schonmal als Semikolon interpretiert werden, wurden hier beide Möglichkeiten eingebaut.
  • Die RegEx-Funktionen lookahead & lookbehind verträgt keine variablen Zeichenlängen des Suchmusters. Manchmal weiß man vorher z.B. nicht, wie viele Leerzeichen später beachtet werden müssen. In dem Fall muss man einfach mehrere Regeln erstellen, welche alle Szenarien abdecken, oder man kombiniert verschiedene Kriterien mit OR (das Pipe-Zeichen |)
    Beispiel für lookbehind mit drei Varianten: ( (?<=(Suchvariante_1)) | (?<=(Suchvariante_2)) | (?<=(Suchvariante_3)) ) Ausgabe_RegEx


wer es genau wissen will, hier der Aufbau der Regeln:

 

# synOCR_YAMLRULEFILE

rule_01:
    tagname: I_am_a_tag
    tagname_RegEx: "HUK[[:digit:]]{2}"
    targetfolder: 
    condition: any
    subrules:
    - searchstring: FindMe
      searchtyp: contains
      isRegEx: false
      source: content
      casesensitive: false

nachstehend eine Beschreibung der Schlüsselwörter:

 # synOCR_YAMLRULEFILE
    • das Schlüsselwort synOCR_YAMLRULEFILE in auskommentierter Form
    • dadurch wird die Regeldatei im YAML-Format interpretiert
    • das Schlüsselwort muss irgendwo in der Datei stehen, um erkannt zu werden

 rule_01:
    rule_01: ist ein Platzhalter für einen individuellen Namen der Regel
    • er besteht nur aus Buchstaben und Zahlen, darf aber nicht mit einer Zahl beginnen
    • er dient nur zur Unterscheidung des Regelblocks
    • der Name muss eindeutig sein
    • am Ende muss ein Doppelpunkt stehen
    • jeder Block definiert EINEN Tag und EINE Aktion (verschieben), falls definiert

 tagname:
    • Syntax: tagname: VALUE (ein Leerzeichen zwischen Doppelpunkt & VALUE)
    • VALUE wird als Tag verwendet, wenn die Regel erfüllt ist
    • nur lateinische Buchstaben / keine Sonderzeichen!
    • nur ein Schlüsselwort pro Regel (>tagname:<)

 tagname_RegEx:
    • optional / wenn nicht definiert, wird tagname: verwendet
    • Syntax: tagname_RegEx: RegEx (ein Leerzeichen zwischen Doppelpunkt & VALUE)
    • VALUE wird als Tag verwendet, wenn die Regel erfüllt ist
    • wird VALUE nicht gefunden, dient tagname als fallback
    • nur ein Schlüsselwort / Kriterium pro Regel (>tagname_RegEx:<)

 targetfolder:
    • optional / wenn nicht definiert, wird das in der GUI definierte Ziel verwendet
    • Syntax: targetfolder: VALUE (ein Leerzeichen zwischen Doppelpunkt & VALUE)
    • VALUE ist ein Pfad, wenn die Regel erfüllt ist
    • es kann ein absoluter Pfad sein (/volume1/...)
    • wenn es sich nicht um einen absoluten Pfad handelt, wird er
     relativ zum in der GUI definierte Zielordner erstellt
    • nur ein Pfad pro Regel (>targetfolder:<)

 condition:
    • wie viele Suchregeln erfüllt sein müssen, damit die Regel erfüllt wird
    • Syntax: condition: VALUE (ein Leerzeichen zwischen Doppelpunkt & VALUE)
    • VALUE ist all / any / none
     condition: all ➜ alle Suchregeln müssen erfüllt werden
     condition: any ➜ irgendeine Suchregel muss erfüllt sein
     condition: none ➜ keine Suchregel darf erfüllt sein
    • nur ein Schlüsselwort pro Regel (>condition:<)

 subrules:
    • Danach werden die Suchregeln beschrieben (verändere nicht "subrules:")
    • Ein Suchregelblock besteht mindestens aus dem Schlüssel - searchstring:
    • eine unbegrenzte Anzahl von Suchregel-Blöcken kann kombiniert werden

 - searchstring:
    • Syntax: - searchstring: VALUE
     beginnt mit einem Bindestrich und einem Leerzeichen
     ein Leerzeichen zwischen Doppelpunkt & VALUE
    • VALUE ist eine Zeichenfolge, ein Suchbegriff oder RegEx
    • VALUE darf nicht leer sein

 searchtyp:
    • Syntax: searchtyp: VALUE (ein Leerzeichen zwischen Doppelpunkt & VALUE)
    • VALUE kann sein:
      contains, does not contain, (irgendwo enthalten)
      is, is not (genaue Zeichenfolge)
      starts with, does not starts with,
      ends with, does not ends with,
     wenn der Parameter fehlt, wird der Standardwert verwendet, (contains)

 isRegEx:
    • definiert Suchbegriff als Text oder RegEx
    • Syntax: isRegEx: VALUE (ein Leerzeichen zwischen Doppelpunkt & VALUE)
    • VALUE kann sein: true / false
     wenn der Parameter fehlt, wird der Standardwert verwendet (false)

 source:
    • Syntax: source: VALUE (ein Leerzeichen zwischen Doppelpunkt & VALUE)
    • VALUE kann sein: content / filename
     wenn der Parameter fehlt, wird der Standardwert verwendet (content)

 casesensitive:
    • Syntax: casesensitive: VALUE (ein Leerzeichen zwischen Doppelpunkt & VALUE)
    • VALUE kann sein: true / false
     wenn der Parameter fehlt, wird der Standardwert verwendet (false)

• abschließend kann die Konfigurationsdatei online überprüft und validiert werden:
    https://codebeautify.org/yaml-validator