---
title: バッチ処理を使用して、CSVで日次データを保存する
description: バッチ処理は時間のかかる処理や定期的に実行したい処理に使用します。今回は、日次でコンテンツをCSVに保存する処理を実装します。
---

## 概要
バッチ処理は時間のかかる処理や定期的に実行したい処理に使用します。  
今回は、日次でコンテンツをCSVに保存する処理を実装します。

### 前提条件
このチュートリアルでは以下の条件でCSVを保存します。
- 毎日00:00にバッチ処理が動作します。
- `topics_group_id=5` に所属し、前日に更新されたコンテンツを取得します。
- 保存する内容はコンテンツID、タイトル、本文、拡張項目1、最終更新日です。
- 取得したコンテンツは日毎にファイルを作成し、 /files/user/topics_log/topics_yyyy-mm-dd.csv に保存します。

## バッチ処理を作成する
それではバッチ処理を作成します。

### 1. バッチ処理の一覧画面を表示する  
メニューの[オペレーション] -> [バッチ処理] をクリックします。 
![Image from Gyazo](https://t.gyazo.com/teams/diverta/590ab86b5450b6f31d6d035f4137a2ae.png)


### 2. バッチ処理の編集画面を表示する 
バッチ処理一覧画面の右上の [追加] をクリックします。
![Image from Gyazo](https://t.gyazo.com/teams/diverta/5cc6b43be0c38cdd8a98ef3886f74d64.png)

すると、バッチ処理編集画面が表示されます。
![Image from Gyazo](https://t.gyazo.com/teams/diverta/2c871fd93afebf3eee702aca26673f79.png)

### 3. タイトル・識別子を記入する
それではバッチ処理を作成していきます。  
まずはタイトルと識別子に記入します。今回は下記のように記入します。

- タイトル：日次コンテンツ出力
- 識別子：sample1_export_topics
- バッチ: 毎日 00:00
- メンバーID: 未指定

:::tip
タイトル・識別子は他のバッチ処理と重複できません。
:::

![Image from Gyazo](https://t.gyazo.com/teams/diverta/69ac2a36346ae3bf157a4bec475b8b7a.png)

### 4. コンテンツ保存処理を記述する
次に、実際の処理を記述します。

エディタ内にデータを追加する処理を記述していきます。
![Image from Gyazo](https://t.gyazo.com/teams/diverta/48d13fbf6692cd5590fc71e8c3164d87.png)

**ヘッダーを出力する**  
まずはCSVのヘッダー行を一時ファイルに出力します。

エディタに下記記入します。

:::caution
２行目の`topics_group_id value=5` は、ご自身のサイトに存在するコンテンツ定義のIDと置き換えて下さい。
:::

```smarty
{assign var=empty_array value='[]'|json_decode:1}
{assign var=topics_group_id value=5}

{* 管理者として実行 *}
{login member_id=1}

{* コンテンツ定義の取得 *}
{capture name=method_params}{ldelim}
"topics_group_id": [{$topics_group_id}],
"ext_config_flg": true
{rdelim}
{/capture}
{assign var=method_params value=$smarty.capture.method_params|json_decode:1}
{api_method
    var=topics_group
    model="TopicsGroup"
    method="details"
    version="1"
    method_params=$method_params
}

{* ヘッダー行の作成 *}
{assign var=header_columns value=$empty_array}
{append var=header_columns index=topics_id    value="コンテンツID"}
{append var=header_columns index=subject      value="タイトル"}
{append var=header_columns index=contents     value="本文"}
{* 拡張項目 *}
{foreach from=$topics_group.ext_config item=config}
    {if $config.ext_col_nm eq 'ext_1'}
        {append var=header_columns index=$config.ext_col_nm value=$config.title}
    {/if}
{/foreach}
{append var=header_columns index=update_ymdhi value="最終更新日"}

{write_file var=path value=$header_columns}
{write_file path=$path value="\n" is_append=1}
```

![Image from Gyazo](https://t.gyazo.com/teams/diverta/77219ae693ecbc775c3c57e5eda0a8f5.png)

**コンテンツを取得する処理を記述する**  
続いて、コンテンツを取得してヘッダー行に続けて書き込みます。

エディタに下記記入します。
```smarty
{* 昨日更新されたコンテンツの取得 *}
{assign var=from_date value="-2 day"|strtotime|date_format:"%Y-%m-%d"}
{assign var=to_date value="-1 day"|strtotime|date_format:"%Y-%m-%d"}
{capture name=method_params}{ldelim}
    "topics_group_id": [{$topics_group_id}],
    "cnt": 100,
    "filter": "update_ymdhi <= \"{$to_date}\" AND update_ymdhi > \"{$from_date}\""
{rdelim}{/capture}
{assign var=method_params value=$smarty.capture.method_params|json_decode:1}
{api_method
    var=topics_list
    model="Topics"
    method="list"
    version="1"
    method_params=$method_params
}

{if $topics_list.errors|@count eq 0 && $topics_list.pageInfo.totalPageCnt > 0}
    {section name=pager loop=$topics_list.pageInfo.totalPageCnt}
        {assign var=request_params value=$empty_array}
        {append var=request_params index=pageID value=$smarty.section.pager.iteration}
        {api_method
            var=topics_list
            model="Topics"
            method="list"
            version="1"
            method_params=$method_params
            request_params=$request_params
        }
        {foreach from=$topics_list.list item=topics}
            {assign var=row value=$empty_array}
            {foreach from=$header_columns item=_v key=index}
                {append var=row index=$index value=$topics.$index}
            {/foreach}
            {write_file path=$path value=$row is_append=1}
            {write_file path=$path value="\n" is_append=1}
        {/foreach}
    {/section}
{/if}
```

![Image from Gyazo](https://t.gyazo.com/teams/diverta/13975995f946142b23ab438b30211409.png)

:::tip
バッチ処理内部であっても一度に多数の件数を取得するとメモリオーバーとなることがあります。
ページング機能を利用することを推奨します。
:::

**データを保存する**  
最後に、一時ファイルをアクセス可能なディレクトリに保存します。

エディタに下記記入します。

```smarty
{put_file tmp_path=$path path="/files/user/topics_log/topics_"|cat:$to_date|cat:".csv"}
```

![Image from Gyazo](https://t.gyazo.com/teams/diverta/a4e85e15ac6362ef1be14240b9635df8.png)

### 6. バッチ処理を保存する 
処理の記述が完了したら、[追加する] ボタンをクリックして保存します。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/f4dcd6847496332b8adf3ac53ea1ffe6.jpg)

以上でバッチ処理の完成です。

### 7. ファイルを確認する
バッチ処理の実行時刻以降、ファイルマネージャーからCSVファイルを取得できます。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/94de3e61ccffad0694db44aefbed4409.png)

![Image from Gyazo](https://t.gyazo.com/teams/diverta/c49edd0043c6e13bf44f7ab348424cda.png)

## 関連ドキュメント
- [カスタム処理を利用して、CSV出力されるデータ構造を変更する](/ja/docs/tutorials/how-to-implement-original-function-into-the-postprocess/)
- [APIをJSON以外のフォーマットでレスポンスできますか？](/ja/docs/faq/how-can-i-response-csv-format)