JSONデータをCSVに出力する

##html上に生成しているJSONデータをCSVに出力します。

表示している一覧表のデータのdatasourceがJSONデータであれば、CSVをダウンロードするときにわざわざサーバにRequestをしなくても、フロントサイドだけで処理が可能となり、ネットワークやサーバの負荷を軽減できると考えます。

###1.ファイル構成

jqueryを使います

```
root
│  index.html
│  
└─js
        exportCSV.js
lib
        jquery-3.2.1.min.js
```

###2.exportCSV.js

JSONをCSVまたはTSV形式でダウンロードするjavascriptです。delimiterに指定する文字列で拡張子が変わる仕様になっています。

```exportCSV.js

//jsonをcsv文字列に編集する
function jsonToCsv(json, delimiter) {
    var header = Object.keys(json[0]).join(delimiter) + "\n";
    var body = json.map(function(d){
        return Object.keys(d).map(function(key) {
            return d[key];
        }).join(delimiter);
    }).join("\n");
    return header + body;
}

//csv変換
function exportCSV(items, delimiter, filename) {

    //文字列に変換する
    var csv = jsonToCsv(items, delimiter);
    
    //拡張子
    var extention = delimiter==","?"csv":"tsv";

    //出力ファイル名
    var exportedFilenmae = (filename  || 'export') + '.' + extention;

    //BLOBに変換
    var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });

    if (navigator.msSaveBlob) { // for IE 10+
        navigator.msSaveBlob(blob, exportedFilenmae);
    } else {
        //anchorを生成してclickイベントを呼び出す。
        var link = document.createElement("a");
        if (link.download !== undefined) {
            var url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", exportedFilenmae);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
}
```

###3.index.html

適当なjson（今回は、大阪市の住所の一部のデータとしました。）を生成して、exportCSVを呼び出します。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <script src="../lib/jquery-3.2.1.min.js"></script>
    <script src="js/exportCSV.js"></script>
  </head>
  <body>
  
  <button type="button" onclick="output();return false;">CSV</button>
  
  <script>
    jsondata = [
      {'addresscode':'534000000', 'prefcode': '27', 'addressname': '大阪市都島区 '},
      {'addresscode':'534002600', 'prefcode': '27', 'addressname': '大阪市都島区 網島町'},
      {'addresscode':'534001300', 'prefcode': '27', 'addressname': '大阪市都島区 内代町'},
      {'addresscode':'534002500', 'prefcode': '27', 'addressname': '大阪市都島区 片町'},
      {'addresscode':'534000100', 'prefcode': '27', 'addressname': '大阪市都島区 毛馬町'},
      {'addresscode':'534001500', 'prefcode': '27', 'addressname': '大阪市都島区 善源寺町'},
      {'addresscode':'534000200', 'prefcode': '27', 'addressname': '大阪市都島区 大東町'},
      {'addresscode':'534001100', 'prefcode': '27', 'addressname': '大阪市都島区 高倉町'},
      {'addresscode':'534001600', 'prefcode': '27', 'addressname': '大阪市都島区 友渕町'},
      {'addresscode':'534002700', 'prefcode': '27', 'addressname': '大阪市都島区 中野町'},
      {'addresscode':'534002400', 'prefcode': '27', 'addressname': '大阪市都島区 東野田町'},
      {'addresscode':'534001400', 'prefcode': '27', 'addressname': '大阪市都島区 都島北通'},
      {'addresscode':'534002200', 'prefcode': '27', 'addressname': '大阪市都島区 都島中通'},
      {'addresscode':'534002100', 'prefcode': '27', 'addressname': '大阪市都島区 都島本通'},
      {'addresscode':'534002300', 'prefcode': '27', 'addressname': '大阪市都島区 都島南通'},
      {'addresscode':'534001200', 'prefcode': '27', 'addressname': '大阪市都島区 御幸町'},
      {'addresscode':'553000000', 'prefcode': '27', 'addressname': '大阪市福島区 '},
      {'addresscode':'553000100', 'prefcode': '27', 'addressname': '大阪市福島区 海老江'},
      {'addresscode':'553000700', 'prefcode': '27', 'addressname': '大阪市福島区 大開'},
      {'addresscode':'553000200', 'prefcode': '27', 'addressname': '大阪市福島区 鷺洲'},
      {'addresscode':'553000400', 'prefcode': '27', 'addressname': '大阪市福島区 玉川'},
      {'addresscode':'553000500', 'prefcode': '27', 'addressname': '大阪市福島区 野田'},
      {'addresscode':'553000300', 'prefcode': '27', 'addressname': '大阪市福島区 福島'},
      {'addresscode':'553000600', 'prefcode': '27', 'addressname': '大阪市福島区 吉野'},
    ];
    var filename = 'サンプル';
    
    function output(){
	    exportCSV(jsondata,',', filename);
    }
  </script>
  </body>
</html>
```

これでCSVボタンをクリックすると「サンプル.csv」というデータがダウンロードされるはずです。

以上です。