官公庁や企業が配布しているcsvデータは、文字コードがshift_jis形式が多く、そのままではちょっと使い回しがしづらい。
そこで、ダウンロードしたcsvファイルの文字コードをutf-8に変換しつつ、同時にjsonに変換してみた。
やること
- Node.js でcsvの文字コードを変換後、json形式に変換して保存
使用パッケージ
流れと前提
csvファイルはすでにダウンロード済みの状態とする。
以下
- 元のcsv
- original.csv
- 一時的に文字コード変換したcsv
- temp.csv
- 最終的に出力したいjsonファイル
- destination.json
とします。処理の順番は以下の流れで行います。
- original.csv をfsで読み込み
- iconv-lite を利用して、文字コードを shift_jis から utf-8 に変換、一時的にtemp.csv に保存
- convert-csv-to-json を利用してjsonファイルに出力
書いてみた
csvのファイルサイズが大きいと文字コード変換に想定外の時間がかかる場合もある。
このため、今回はPromiseオブジェクトを生成して、確実に文字コード変換が終わってからJSON変換を行う様に書いてみました。
const fs = require('fs');
const iconv = require('iconv-lite');
const csv=require('convert-csv-to-json');
genCSV().then(res => {
const fileInputName = 'temp.csv';
const fileOutputName = 'destination.json';
csv.fieldDelimiter(',') .getJsonFromCsv(fileInputName);
csv.generateJsonFileFromCsv(fileInputName,fileOutputName);
console.log('destination.json has been saved!');
});
function genCSV(){
return new Promise((resolve, reject) => {
fs.readFile('./original.csv' , function(err, data){
const buf = new Buffer.from(data, 'binary');
const retStr = iconv.decode(buf, "Shift_JIS");
fs.writeFile('temp.csv', retStr, (err) => {
if (err) throw err;
console.log(temp.csv has been saved!');
resolve(retStr);
});
});
});
}
※冗長なので、もう少しスッキリかけないか調べる。
参考
https://www.npmjs.com/package/convert-csv-to-json
https://www.npmjs.com/package/iconv-lite
https://www.kakistamp.com/entry/2019/04/21/230859
https://photo-tea.com/p/nodejs-shift-jis-read/