2014-12-06

Regular Expressions and FME String Functions

正規表現とFME文字列関数

From this thread.
このスレッドより。
Community Answers > Stringrepalcer

The requirement can be summarized as:
Split a string consisting of space-separated parts; extract each first four characters from the first and the second parts; concatenate them with a comma delimiter.
要求は次のように要約できます。
空白で区切られたいくつかの部分で構成された文字列を分割し、1番目と2番目の部分からそれぞれ先頭の4文字を抽出し、それらをカンマ区切りで連結する。
e.g. 例えば:
Input: "54960000.0 643600000.63 0.0"
Output: "5496,6436"

As a basic approach, it can be realized with an AttributeSplitter, two SubstringExtractors, and a StringConcatenator.
基本的なアプローチとして、これは一つのAttributeSplitter、二つのSubstringExtractor、一つのStringConcatenatorで実現できます。











Of course this approach is good, but the question is how to do that with one step.
My first inspiration was the StringReplacer with this regular expression.
もちろんこのアプローチで良いのですが、質問は、これを一つのステップで行うにはどうするか、です。
最初のインスピレーションはこの正規表現を使ったStringReplacerでした。
-----
^([0-9]{4})[^\s]*\s+([0-9]{4}).*$
-----

Regular expressions are very flexible. I think that a regular expression can be used in almost all the cases where you need to extract some parts of a character string based on specific patterns.
正規表現は非常に柔軟で、文字列から特定のパターンに該当する部分を抽出したいときには、ほとんど全てのケースで使えると思います。

However, in some cases, the FME String Functions could also be convenient.
In the case above, if the original string is stored by a feature attribute called "coord", this expression written in the Value column of an AttributeCreator returns the required result.
しかし、あるケースでは、FME文字列関数が便利なこともあります。
上記の場合、オリジナルの文字列が"coord"という属性に格納されているならば、AttributeCreatorのValue列に書かれた次の式は必要な結果を返します。
-----
@Left(@Value(coord),4),@Left(@GetWord(@Value(coord),1),4)
-----

@Left function returns first N characters of specified string (N is the number of characters);
@GetWord function returns the Nth part (N is 0-based index) of space-separated parts.
@Left関数は指定された文字列の最初のN文字を返し(Nは文字数)、
@GetWord関数は空白で区切られた第N番目(Nは0から始まるインデクス)の部分を返します。

=====
2014-12-08: Alternatively, @ReplaceRegEx function can also be used.
あるいは、@ReplaceRegEx関数も使えます。
-----
@ReplaceRegEx(@Value(coord),^([0-9]{4})[^\s]*\s+([0-9]{4}).*$,"\1,\2")
=====

The FME String Functions are relatively easy to understand, so I think it's worth to consider using them in many cases.
FME文字列関数は比較的分かり易いので、多くの場合で検討に値すると思います。
FME Workbench Transformers > String Functions

But, more than enough is too much...
ただし、過ぎたるは及ばざるがごとし。。。
FME String Functions


Addition.
If you prefer scripting, assuming "coord" is storing a space-separated strings:
おまけ。
スクリプトを好むならば、"coord"が空白区切りの文字列を格納していると仮定して:

Tcl script examples for the "Value" in an AttributeCreator (enter with the Arithmetic Editor)
AttributeCreator "Value"のためのTclスクリプト例 (Arithmetic Editorで入力)
-----
[regsub {^([0-9]{4})[^\s]*\s+([0-9]{4}).*$} "@Value(coord)" {\1,\2}]
-----
[format {%s,%s} [string range "@Value(coord)" 0 3] [string range [lindex "@Value(coord)" 1] 0 3]]
-----

Script examples for the "Tcl Expression" in a TclCaller
TclCaller "Tcl Expression"のためのスクリプト例
-----
return [regsub {^([0-9]{4})[^\s]*\s+([0-9]{4}).*$} [FME_GetAttribute coord] {\1,\2}]
-----
return [format {%s,%s} [string range [FME_GetAttribute coord] 0 3] [string range [lindex [FME_GetAttribute coord] 1] 0 3]]
-----

Script examples for a PythonCaller
PythonCallerのためのスクリプト例
-----
import re
def processFeature(feature):
    src = feature.getAttribute('coord')
    feature.setAttribute('coord', re.sub(r'^([0-9]{4})[^\s]*\s+([0-9]{4}).*$', r'\1,\2', src))
-----
def processFeature(feature):
    src = feature.getAttribute('coord')
    feature.setAttribute('coord', '%s,%s' % (src[:4], src.split(' ')[1][:4]))
-----
and so on.
などなど。

In fact, the StringReplacer uses the Tcl command "regsub" internally.
実のところ、StringReplacerは内部でTclコマンド"regsub"を使っています。

Déjà vu (already seen) :-)
デジャヴ (^^)
Community Answers > Leading zeros
Poor Cat

=====
2014-12-08: Forgot the JavaScriptCaller transformer.
JavaScriptCallerトランスフォーマーを忘れていました。
-----
var src = fme_get_attribute("coord");
fme_set_attribute("coord", src.replace(/^([0-9]{4})[^\s]*\s+([0-9]{4}).*$/, "$1,$2"));
-----
var src = fme_get_attribute("coord");
fme_set_attribute("coord", src.substr(0, 4) + "," + src.split(' ')[1].substr(0, 4));
-----
hmm... the JavaScriptCaller may be convenient for string operations, although I have never used yet in a practical workspace.
... but Japanese characters written in a script seems not to be interpreted correctly. Unfortunate.
うむむ。実際のワークスペースではまだ一度も使ったことはないけど、JavaScriptCallerは文字列の操作をするのに便利かも知れない。
... しかし、スクリプト中に書かれた日本語文字は正しく解釈されないみたいだ。残念。
=====

FME 2014 SP4 build 14433

No comments:

Post a Comment