2016-05-15 4 views
1

Ich müsste die Verwendung von ReplaceTextWithMapping in NiFi in meinem speziellen Fall klären. Meine Eingabedatei sieht wie folgt aus:ReplaceTextWithMapping mit mehreren Spalten in Mapping-Datei verwenden

{"field1" : "A", 
"field2" : "A", 
"field3": "A" 
} 

Die Mapping-Datei sieht stattdessen wie folgt aus:

Header1;Header2;Header3 
A;some text;2 

Mein erwartete Ergebnis wäre wie folgt:

{"field1" : "some text", 
    "field2": "A", 
    "field3": "A2" 
    } 

Der reguläre Ausdruck Set ist einfach wie folgt:

[A-Z0-9]+ 

und es entspricht dem Feldschlüssel in der Zuordnungsdatei (wir erwarten entweder einen Groß- oder Großbuchstaben + Ziffer), aber ich bin mir nicht sicher, wie Sie entschieden haben, welchen Wert (aus Spalte 2 oder Spalte 3) Sie zuweisen möchten der Eingabewert zu. Außerdem sollte sich mein Feld2 nicht ändern und muss denselben Wert beibehalten, den es vom Eingabewert erhält, ohne dass eine Zuordnung erforderlich ist. Im Moment bin ich immer so etwas wie dieses:

{"field1" : "some text A2", 
    "field2": "some text A2", 
    "field3": "some text A2" 
    } 

Ich denke, meine wichtigste Frage ist: können Sie den gleichen Wert in der Eingabedatei mit verschiedenen Werten aus unterschiedlichen Spalte Ihrer Zuordnungsdatei zugeordnet?

Danke

EDIT: Ich bin mit ReplaceTextWithMapping, ein Out-of-the-box-Prozessor in Apache Nifi (v 0.5.1.). Während meines Datenflusses habe ich eine JSON-Datei, auf die ich einige Mappings anwenden muss, die von externen Dateien stammen, die ich im Arbeitsspeicher laden möchte (anstatt beispielsweise mit ExtractText zu analysieren).

Antwort

0

Vorwärts

Es scheint, dass Sie mit einem JSON-String arbeiten, wäre es einfacher, mit einer solchen Zeichenfolge über ein JSON Parsing-Engine als JSON-Struktur zu arbeiten, ermöglicht die Erstellung von schwierigen Grenzfälle, die Parsing macht mit regulären Ausdrücken schwierig. Damit haben Sie sicher Ihre Gründe und ich bin nicht die Regex Police.

Beschreibung

einen solchen Ersatz zu tun wäre es die Teilstrings zu erfassen leichter Sie halten werden und die Teil Sie ersetzen möchten.

(\{"[a-z0-9]+"\s*:\s*")([a-z0-9]+)("[,\r\n]+"[a-z0-9]+"\s*:\s*")([a-z0-9]+)("[,\r\n]+"[a-z0-9]+"\s*:\s*")([a-z0-9]+)("[,\r\n]+\})

mit Ersetzen: $1SomeText$3$4$5A2$7

Regular expression visualization

Hinweis: Ich empfehle die folgenden Flags mit diesem Ausdruck mit: Case Insensitive und Dot passt auf alle Zeichen einschließlich der neuen Linien.

Exmaples

Live-Deno

Dieses Beispiel zeigt, wie der reguläre Ausdruck gegen Rohtext matches: https://regex101.com/r/vM1qE2/1

Quelle Text

{"field1" : "A", 
"field2" : "A", 
"field3": "A" 
} 

Nach Ersatz

{"field1" : "SomeText", 
"field2" : "A", 
"field3": "A2" 
} 

Erklärung

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    \{      '{' 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    [a-z0-9]+    any character of: 'a' to 'z', '0' to '9' 
          (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 
          or more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    :      ':' 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 
          or more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    (      group and capture to \2: 
---------------------------------------------------------------------- 
    [a-z0-9]+    any character of: 'a' to 'z', '0' to '9' 
          (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
)      end of \2 
---------------------------------------------------------------------- 
    (      group and capture to \3: 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    [,\r\n]+     any character of: ',', '\r' (carriage 
          return), '\n' (newline) (1 or more times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    [a-z0-9]+    any character of: 'a' to 'z', '0' to '9' 
          (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 
          or more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    :      ':' 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 
          or more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
)      end of \3 
---------------------------------------------------------------------- 
    (      group and capture to \4: 
---------------------------------------------------------------------- 
    [a-z0-9]+    any character of: 'a' to 'z', '0' to '9' 
          (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
)      end of \4 
---------------------------------------------------------------------- 
    (      group and capture to \5: 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    [,\r\n]+     any character of: ',', '\r' (carriage 
          return), '\n' (newline) (1 or more times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    [a-z0-9]+    any character of: 'a' to 'z', '0' to '9' 
          (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 
          or more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    :      ':' 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 
          or more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
)      end of \5 
---------------------------------------------------------------------- 
    (      group and capture to \6: 
---------------------------------------------------------------------- 
    [a-z0-9]+    any character of: 'a' to 'z', '0' to '9' 
          (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
)      end of \6 
---------------------------------------------------------------------- 
    (      group and capture to \7: 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    [,\r\n]+     any character of: ',', '\r' (carriage 
          return), '\n' (newline) (1 or more times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    \}      '}' 
---------------------------------------------------------------------- 
)      end of \7 
+0

Hallo, vielen Dank für Ihre sehr ausführliche Antwort, sehr geschätzt. Ich benutze tatsächlich einen NiFi-Prozessor namens ReplaceTextWithMapping (siehe hier: https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi.processors.standard.ReplaceTextWithMapping/index.html) und ich scheine um passende Gruppen verwenden zu können (Matching group property), obwohl es scheint, dass ich nur eins nach dem anderen setzen kann. Ich habe ein paar Versuche gemacht, aber es funktioniert nicht in NiFi. – paranza

+0

Das Dokument für ReplaceTextWithMapping besagt, dass das Ersetzungssystax eine Zahl ohne Dollarzeichen ist. Ich empfehle ReplaceText, das die Dollarsign + Number Combo für die Ersetzung von Werten verwendet. https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi.processors.standard.ReplaceText/index.html –

+0

Ja, das war mein erster Schritt, aber über den Datenfluss zu ReplaceTextWithMapping verschoben Ich muss einige Mappings anwenden, die von externen Dateien kommen. Deshalb verwende ich ReplaceTextWithMapping und bin mir nicht sicher, ob mir etwas fehlt, aber es scheint nicht möglich zu sein, mit mehreren übereinstimmenden Gruppen zu arbeiten. Danke für Ihre Hilfe, geschätzt. – paranza

0

So tauchte ich in ReplaceTextWithMapping zu versuchen und es Ihren Anwendungsfall zu lösen, aber ich glaube einfach nicht mächtig genug, um zu tun, was Sie wollen. Derzeit ist es fast ausschließlich für den Zweck entworfen: eine einfache Regex zu entsprechen, eine Gruppe von Nicht-Leerzeichen Zeichen zu einer anderen Gruppe von Zeichen zuordnen (kann Leerzeichen und Rückverweise haben).

Wenn Sie Ihren Anwendungsfall als reinen Text betrachten, können Sie den Wert einer Erfassungsgruppe basierend auf dem Wert einer anderen Erfassungsgruppe und einer Zuordnungsdatei ändern. Wenn Sie es in JSON betrachten, ist Ihr Anwendungsfall viel einfacher. Sie möchten den Wert eines Schlüssel/Wert-Paars basierend auf dem Schlüssel und einer Zuordnungsdatei ändern. Randnotiz, wenn Sie die Mapping-Datei nicht brauchen, glaube ich, dass es einen neuen JSON-Prozessor für JSON-Prozessor in 0.7.0 [1] gibt, der funktionieren würde.

Wenn Sie nach einer Lösung suchen, sind beide Betrachtungsweisen Ihres Problems gültig. ReplaceTextWithMapping könnte die erweiterte Funktionalität sicherlich verwenden, um erweiterte Anwendungsfälle zuzulassen, aber sie könnte es zu kompliziert machen (obwohl es aufgrund des unklaren Umfangs der Funktionalität verwirrender sein könnte). Ein neuer Prozessor, ähnlich wie "ReplaceJsonWithMapping", könnte sicherlich hinzugefügt werden, müsste aber seinen Umfang und Zweck klar definieren.

Auch für eine unmittelbare Lösung gibt es immer die Option, den ExecuteScript-Prozessor zu verwenden. Hier [2] ist ein Link zum Blog (geschrieben vom Schöpfer von ExecuteScript), der beschreibt, wie man einen grundlegenden JSON-zu-JSON-Prozessor schreibt. Es müsste mehr Logik hinzugefügt werden, um eine Datei für das Mapping lesen zu können.

[1] https://issues.apache.org/jira/browse/NIFI-361 [2] http://funnifi.blogspot.com/2016/02/executescript-json-to-json-conversion.html

Verwandte Themen