JavaScript(Node.js)でエクセルデータ(CSV)からJSONファイルを出力する（都道府県データ）

# 概要
JavaScript(Node.js)を用いて、excelデータJSONに出力するまでの流れを説明する。

# 事前準備

ターミナル or コマンドプロンプト
nodeのインストール（https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09）
Excelファイル

Excelファイルは、総務省が掲載している、都道府県コード及び市区町村コード（令和元年5月1日現在）を使用する。
http://www.soumu.go.jp/denshijiti/code.html


# 手順

1. csvファイルを作る(prefectures.csv)
2. jsファイルを作る(prefectures.js)
3. jsと同じディレクトリにcsvファイルを入れる
4. csvファイルをコンソールで表示する
5. バイナリーデータを文字列に変換する
6. 文字列を配列に変換する
7. 配列をJSONに変換する
8. jsonファイルを出力する

データ変換の流れとしては

csv => バイナリーデータ => 文字列 => 配列 => JSON

という順番でJSONファイルを作成することができる

## csvファイルを作る(prefectures.csv)

http://www.soumu.go.jp/denshijiti/code.html
からエクセルデータをダウンロードし、 `prefectures.csv` という名前で保存（名前は自由）
その後、prefectures.csvを開き、ヘッダー部分（1-5行目）を削除する（データを統一するため）

```
団体コード,"都道府県名
（漢字）","市区町村名
（漢字）","都道府県名
（カナ）","市区町村名
（カナ）",,
```


## csv => バイナリーデータ

csvファイルと同じディレクトリに `prefectures.js` を作成する
Node.jsには公式モジュールのfsがあるのでそれを使用する。
https://nodejs.org/api/fs.html#fs_file_system

```js

const FS = require('fs')
const PATH = require('path')

const csvPath = PATH.join(__dirname, 'prefectures.csv')
```

csvファイルのpathを確認する。確認方法は `ターミナル` で `node ファイル名.js` コマンドを叩く

```
$ cd test
$ node prefectures.js
/Users/yourname/Desktop/test/prefectures.csv
```

readFileSyncでcsvの中身を読み込む。
ファイルの中身を読むにはfs.readFileSyncを用いる。

```js

const csvData = FS.readFileSync(csvPath)
console.log(csvData)
//<Buffer 30 31 30 30 30 36 2c e5 8c 97 e6 b5 b7 e9 81 93 2c 2c ef be 8e ef bd af ef bd b6 ef bd b2 ef be 84 ef be 9e ef bd b3 2c 2c 2c 0d 0a 30 31 31 30 30 32 ... >

```
しかし、バイナリデータが表示されるので、文字列に直す

## バイナリデータ => 文字列

```js

const csvData = FS.readFileSync(csvPath).toString()
console.log(csvData)
// 010006,北海道,,ﾎｯｶｲﾄﾞｳ,,,
```

今度は、csvの中身が１つの文字列として表示される。これを配列に変換する。

## 文字列 => 配列

1つの文字列からデータを分けるために、配列に変換する。

改行コードで区切るようにする

```js

const rows = csvData.split('\n')
console.log(rows)

// [ '010006,北海道,,ﾎｯｶｲﾄﾞｳ,,,\r',
//  '011002,北海道,札幌市,ﾎｯｶｲﾄﾞｳ,ｻｯﾎﾟﾛｼ,,\r',
//  '012025,北海道,函館市,ﾎｯｶｲﾄﾞｳ,ﾊｺﾀﾞﾃｼ,,\r',...]

```

`\r`が余分に入っているので取り除く(UNIX系のＯＳでは`\n`が使われ、Microsoft系のＯＳ（Excel等）では、`\r\n`が使われるため)

```js

const rows = csvData.split('\r\n')
console.log(rows)
// [ '010006,北海道,,ﾎｯｶｲﾄﾞｳ,,,',
//  '011002,北海道,札幌市,ﾎｯｶｲﾄﾞｳ,ｻｯﾎﾟﾛｼ,,',
//  '012025,北海道,函館市,ﾎｯｶｲﾄﾞｳ,ﾊｺﾀﾞﾃｼ,,'...]

```

これで、１つの配列内に、複数の文字列を格納することができた。
続いて、区切ったものを配列に入れていく。

```js

const prefectures = rows.map(row => {
  return row.split(',')
})
console.log(prefectures)
// [ [ '010006', '北海道', '', 'ﾎｯｶｲﾄﾞｳ', '', '', '' ],
//   [ '011002', '北海道', '札幌市', 'ﾎｯｶｲﾄﾞｳ', 'ｻｯﾎﾟﾛｼ', '', '' ],
//   [ '012025', '北海道', '函館市', 'ﾎｯｶｲﾄﾞｳ', 'ﾊｺﾀﾞﾃｼ', '', '' ],...]

```

これだと、配列の中に配列が入っている状態(多次元配列）なので、１つの配列の中に複数のオブジェクトを作り、JSONにする。

## 配列 => JSON

```js

const prefectures = rows.map(row => {
  const cols = row.split(',')
  return {
    code: cols[0],
    prefecture: cols[1],
    city: cols[2],
    prefectureKana: cols[3],
    cityKana: cols[4]
  }
})
console.log(prefectures)
//  { code: '011002',
//    prefecture: '北海道',
//    city: '札幌市',
//    prefectureKana: 'ﾎｯｶｲﾄﾞｳ',
//    cityKana: 'ｻｯﾎﾟﾛｼ' },///]

```


 `writeFileSync` を用いてJSONファイルを作成する

```js

const jsonPath = PATH.join(__dirname, 'prefectures.json')
FS.writeFileSync(jsonPath, JSON.stringify(prefectures))
```

実装に関してはここまで。最後に

```
$ node prefectures.js
```

を行い、同じディレクトリに `prefectures.json` が入っていれば完成。