# Query String Parser関数

Treasure Data Data Connector用の`query string`パーサープラグインは、`key=value&key2=value2`形式のクエリ文字列データを`{key: "value", key2: "value2"}`に変換します。[Embulk parser plugin](https://github.com/treasure-data/embulk-parser-query_string)について読む。

| オプション | 説明 |
|  --- | --- |
| strip_quote | "foo=FOO&bar=BAR"のような引用符で囲まれた行のファイルがある場合、引用符を削除するためにtrueにする必要があります。（bool、デフォルト：true） |
| strip_whitespace | ' foo=FOO'のようなインデントされた行を正しくパースするために、パース前に空白を削除します。（bool、デフォルト：true） |
| capture | 正規表現を使用して各行から有効なテキストをキャプチャします。最初にマッチしたパターン（$1）が使用されます。[partial-config.yml](https://github.com/treasure-data/embulk-parser-query_string/blob/master/partial-config.yml)も参照してください。（string、デフォルト：nil） |
| charset | 文字エンコーディング（例：ISO-8859-1、UTF-8） |
| newline | 改行文字（CRLF、LFまたはCR） |
| `columns` | カラム（下記参照） |


`columns`オプションはカラムのリストを宣言します。

| カラム | 説明 |
|  --- | --- |
| name | カラムの名前 |
| type | カラムの型：**long**：64ビット符号付き整数**timestamp**：ナノ秒精度の日時**double**：64ビット浮動小数点数**string**：文字列 |


## 設定

`parser`セクションを設定します：

```yaml
in:
...
  parser:
    strip_quote: true
    strip_whitespace: true
    charset: UTF-8
    newline: CRLF
    type: query_string
    columns:
      - {name: id, type: long}
      - {name: name, type: string}
      - {name: price, type: double}
      - {name: datetime, type: timestamp}
out:
...
```

## ユースケース例：シンプルなケース

ソースデータの例

```
"user_id=42&some_param=ABC&price=100.95&datetime=2014-05-14_10:11:25"
"user_id=43&some_param=EFG&price=200.04&datetime=2015-05-15_11:11:25"
"user_id=44&some_param=XYZ&price=300.34&datetime=2016-05-16_12:11:25"
"user_id=44&some_param=XYZ&price=531.24&datetime=2017-05-17_23:11:25"
```

`load.yml`の例

```yaml
in:
  ...
  parser:
strip_quote: true
strip_whitespace: true
charset: UTF-8
newline: CRLF
type: query_string
columns:
  - {name: user_id, type: long}
  - {name: some_param, type: string}
  - {name: price, type: double}
  - {name: datetime, type: timestamp}
  filters: []
  out: {mode: append}
  exec: {}
```

`preview`コマンドでパースされたクエリ文字列データを表示できます。

```bash
$ td connector:preview load.yml
```

```bash
+--------------+-------------------+--------------+---------------------------+
| user_id:long | some_param:string | price:double | datetime:timestamp        |
+--------------+-------------------+--------------+---------------------------+
| 42           | "ABC"             | 100.95       | "2014-05-14 10:11:25 UTC" |
| 43           | "EFG"             | 200.04       | "2015-05-15 11:11:25 UTC" |
| 44           | "XYZ"             | 300.34       | "2016-05-16 12:11:25 UTC" |
| 44           | "XYZ"             | 531.24       | "2017-05-17 23:11:25 UTC" |
+--------------+-------------------+--------------+---------------------------+
```

データにtimeカラムがない場合、`add_time`フィルターオプションを使用して追加できます。詳細は[add_timeフィルタープラグイン](/ja/products/customer-data-platform/integration-hub/batch/import/filter/add_time-filter-function)を参照してください。

```bash
$ td connector:issue load.yml --database <database name> --table <table name>  --time-column timestamp --auto-create-table
```

## ユースケース例：「capture」オプションの使用

ソースデータは以下の通りです。

```bash
site A: "user_id=42&some_param=ABC&price=100.95&datetime=2014-05-14_10:11:25"
site B: "user_id=43&some_param=EFG&price=200.04&datetime=2015-05-15_11:11:25"
site C: "user_id=44&some_param=XYZ&price=300.34&datetime=2016-05-16_12:11:25"
site A: "customer_id=44&some_param=XYZ&price=531.24&datetime=2017-05-17_23:11:25"
```

以下の`load.yml`を使用した場合。

```yaml
in:
  ...
  parser:
strip_quote: true
strip_whitespace: true
capture: 'site A: ("u.*")'
charset: UTF-8
newline: CRLF
type: query_string
columns:
  - {name: user_id, type: long}
  - {name: some_param, type: string}
  - {name: price, type: double}
  - {name: datetime, type: timestamp}
  filters: []
  out: {mode: append}
  exec: {}
```

`capture`オプションは最初の行のみにマッチするため、結果は以下のようになります。

```bash
$ td connector:preview load.yml
```

```bash
+--------------+-------------------+--------------+---------------------------+
| user_id:long | some_param:string | price:double | datetime:timestamp        |
+--------------+-------------------+--------------+---------------------------+
| 42           | "ABC"             | 100.95       | "2014-05-14 10:11:25 UTC" |
+--------------+-------------------+--------------+---------------------------+
```

* `site B`と`site C`は`site A:`部分にマッチしません。
* 2番目の`site A`行は、クエリ文字列がc（customer_id）で始まるため、`("u.*")`部分にマッチしません。