LoginSignup
7
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-25

概要

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


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を用いる。


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 ... >

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

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


const csvData = FS.readFileSync(csvPath).toString()
console.log(csvData)
// 010006,北海道,,ホッカイドウ,,,

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

文字列 => 配列

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

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


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

// [ '010006,北海道,,ホッカイドウ,,,\r',
//  '011002,北海道,札幌市,ホッカイドウ,サッポロシ,,\r',
//  '012025,北海道,函館市,ホッカイドウ,ハコダテシ,,\r',...]

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


const rows = csvData.split('\r\n')
console.log(rows)
// [ '010006,北海道,,ホッカイドウ,,,',
//  '011002,北海道,札幌市,ホッカイドウ,サッポロシ,,',
//  '012025,北海道,函館市,ホッカイドウ,ハコダテシ,,'...]

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


const prefectures = rows.map(row => {
  return row.split(',')
})
console.log(prefectures)
// [ [ '010006', '北海道', '', 'ホッカイドウ', '', '', '' ],
//   [ '011002', '北海道', '札幌市', 'ホッカイドウ', 'サッポロシ', '', '' ],
//   [ '012025', '北海道', '函館市', 'ホッカイドウ', 'ハコダテシ', '', '' ],...]

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

配列 => JSON


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ファイルを作成する


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

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

$ node prefectures.js

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

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7