LoginSignup
7
10

More than 3 years have passed since last update.

shift_jis のcsvファイルをutf-8のjsonに変換する

Posted at

官公庁や企業が配布しているcsvデータは、文字コードがshift_jis形式が多く、そのままではちょっと使い回しがしづらい。

そこで、ダウンロードしたcsvファイルの文字コードをutf-8に変換しつつ、同時にjsonに変換してみた。

やること

  • Node.js でcsvの文字コードを変換後、json形式に変換して保存

使用パッケージ

流れと前提

csvファイルはすでにダウンロード済みの状態とする。

以下

  • 元のcsv
    • original.csv
  • 一時的に文字コード変換したcsv
    • temp.csv
  • 最終的に出力したいjsonファイル
    • destination.json

とします。処理の順番は以下の流れで行います。

  1. original.csv をfsで読み込み
  2. iconv-lite を利用して、文字コードを shift_jis から utf-8 に変換、一時的にtemp.csv に保存
  3. 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/

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