> ## Documentation Index
> Fetch the complete documentation index at: https://www.integrate.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# ETL: Xplenty入門 Part3: Xplentyでよく行われる文字列操作

> Integrate.io ETLでよく行われる文字列の分割、抽出、置換、固定長処理などの操作を、STRSPLITやREGEX_EXTRACTなどの関数の実例とともに解説します。

このブログでは、Xplentyでよく行われる文字列などの変換処理について解説します。
※今後、新しいケースがあれば、こちらのブログに随時追加していく予定です。

**よく行われる文字列操作**

## Q1. 氏名を姓(Last Name)と名(First Name)に分けるには？

**STRSPLIT**関数を使用することで、区切り文字を指定し、文字列を分割して取得することが可能です。
例：field1:田中　太郎
`STRSPLIT(field1,' ').$0`
\==> 田中
`STRSPLIT(field1,' ').$1`
\==> 太郎

## Q2. 値がひらがなの場合のみ取得するには？

**REGEX\_EXTRACT**関数を使用することで、正規表現を使用し、ひらがなおよび半角/全角スペースを含む文字列を取得することが可能です。
`REGEX_EXTRACT(field1,'[ぁ-ん( |　)]+',0)`
例：field1:やまだ たろう
\==> やまだ たろう
例：field1:山田　太郎
\==> null

## Q3. 住所を分けるには?

Xplentyでは完全に実現することは難しいですが、以下のような方法で番地部分を分けることが可能です。
Xplentyでは、正規表現を使用して条件にマッチした部分のみを取得することが可能です。

### 1. 都道府県部分を取得するには

**REGEX\_EXTRACT**関数を使用し正規表現を使って、条件にマッチする部分を抽出します。
field1: 東京都港区六本木6-10-1
`REGEX_EXTRACT(field1,'(..都|..府|..道|([一-鿿]{2,3})*県)',0)`
-> 東京都

### 2. 上記以外の部分を取得

**INDEXOF**関数で、条件にマッチする文字列の場所を判定することが可能です。
field1: 東京都港区六本木6-10-1
field10: 東京都
`SUBSTRING(field1,INDEXOF(field1,field10)+Length(field10),Length(field3))`
->港区六本木6-10-1

## Q4. Replace関数

### 1. 通常文字列の置換

例）field1: '埼玉県埼玉市'
`REPLACE(field1,'埼玉市','さいたま市')`
-> 埼玉県さいたま市

### 2. 一部の文字を除外する

文字列に含まれる「?」などの特殊な文字を置換する場合はエスケープ文字を利用する
?を除外したい場合は`\?`とする
例）field1: '2022/?01/01'
`REPLACE(field1,'\?','')`
-> '2022/01/01'

### 3. 改行コードの置換

Webアプリケーションデータなどに含まれる改行コードをDBに保存する際に改行コードとして保存するには?
例）field1='あああああああああああああ`<BR>`いいいいいいいいいいいいいいい'
`<BR>`部分をReplace関数を使用して、DBで設定されている文字コードに合わせて正しい改行コードに置換ください。
`REPLACE(field名,'<BR>','\r\n')`

## Q5. 半角カタカナを検知する

`CASE WHEN field1 MATCHES '.*[ｦ-ﾟ].*' THEN 'Y' ELSE 'N' END`

* field1の値が「あああアｱあ」　の場合 > Y
* field1の値が　「ああああアあ」　の場合 > N

## Q6. NULLの置換について

COALESCE関数もしくはCase文で可能です。

* Case文の例：`CASE WHEN field1 is null then 'なし' ELSE field1 END`

* COALESCE関数の例：`COALESCE(field1, 'なし')`
  field1がNULLだった場合のみ２つ目の引数にセットされた値もしくは列（上記の例だと「なし」）がセットされる

**JSONの文字列操作**

## Q1. JSONのBAG型データからネスト化された値を取得するには?

以下のような\[]で複数の値をもつBAG型のデータをXplentyで扱う方法について紹介します。

```json theme={null}
[
    {
        "key": "first_name",
        "value": "Taro",
        "label": "FIRST NAME"
    },
    {
        "key": "last_name",
        "value": "Yamada",
        "label": "LAST NAME"
    },
    {
        "key": "gender",
        "value": "Male",
        "label": "GENDER",
        "is_required": "required",
        "datatype": "text"
    }
]
```

BAG型のデータから必要な値だけを抽出する
ネスト化された値からパスを指定して取得するには、**JsonExtractScalar**関数を使用すると便利です。

FIRST NAMEを取得：`JsonExtractScalar(field名,'$.[0].value') > Taro`
LAST NAMEを取得：`JsonExtractScalar(field名,'$.[1].value') > Yamada`
GENDERを取得：`JsonExtractScalar(field名,'$.[2].value') > Male`

今回のブログでは、Xplentyで固定長のフィールドを扱う必要がある場合のTipsについて紹介します。

**固定長の文字列をフィールドごとに分割するには?**

Selectコンポーネントで以下のように設定可能です。
式：Substring(フィールド,開始位置,終了位置)
使用例：
`SUBSTRING('aaaaa00000あああああ11111',0,5)` > 'aaaaa'
`SUBSTRING('aaaaa00000あああああ11111',5,10)` > '00000'
`SUBSTRING('aaaaa00000あああああ11111',10,15)` > 'あああああ'

**固定長の文字列を生成するには？**

Selectコンポーネントで以下のように設定可能です。
式：SPRINTF('%08d',数値)
使用例：

| 式                    | 結果                    | 説明                    |
| -------------------- | --------------------- | --------------------- |
| SPRINTF('%08d',1)    | '00000001'            | 8桁 (左を桁数分０で詰める）       |
| SPRINTF('%05d',10)   | '00010'               | 5桁 (左を桁数分０で詰める）       |
| SPRINTF('%5s','あ')   | '\_\_\_\_あ'           | 5桁 (左を桁数分半角スペースで詰める）  |
| SPRINTF('%-10s','あ') | 'あ\_\_\_\_\_\_\_\_\_' | 10桁 (右を桁数分半角スペースで詰める） |

例外： 「１」 > 「10000」のように右にゼロを追加して詰めることはできません。
数値を桁数に応じて10,100,1000、10,000倍するなどの対応が必要です。

また、もし想定している桁数を超えたデータが入ってくるような場合、CASE文とLength関数、SUBSTRING関数を使用して、超過分の文字列を切り捨てることができます。
**5桁を超える場合の制御例：**

```
CASE WHEN Length(field1) > 5 THEN
  SPRINTF('%-5s'(SUBSTRING(field1,0,5)) ELSE
  SPRINTF('%-5s',field1)
END
```
