Nodeでスプシデータをcsv→jsonに変換して、条件に合う要素をリスト化する


スプシの大規模データを整理するときに楽になったので備忘録として残します。

この記事で扱うデータはフィクションです。実在の人物や団体などとは関係ありません。

※この記事のダミーデータはこちらからお借りしています。
テストデータ・ジェネレータ


この記事の目標 : 住所が大阪の人をリストアップしてテキストデータに書き出す!

使用環境

OS: macOS
Node: v12.2.0
npm: 6.9.0

パッケージのインストール

Nodeとnpmの環境設定は省略しています。
まずはターミナルから適当なプロジェクトフォルダに必要なパッケージをインストールします。

$npm init -y
$npm i -D fs csvtojson js-beautify

csvtojsonがコンバータ

csv -> json の変換

スプシからcsvをダウンロード

変換スクリプトを書く

csvjson_converter.js
let fs   = require('fs');
let csv  = require('csvtojson');
let beautify = require('js-beautify').js;

let csvFile = './checksheet.csv';


csv().fromFile(csvFile).then((jsonData)=>{
  fs.writeFile('checksheet.json', beautify(JSON.stringify(jsonData),{}), function(err) {
    if (err) console.log('error', err);
  });
});

スプシからダウンロードした[checksheet.csv]を[checksheet.json]に変換して
beautifyでインデントを追加して書き出す命令を記述。

$ node csvjson_converter.js

ターミナルからスクリプトを実行

こんな感じのjsonが書き出されました。

必要な要素をリスト化してテキストデータに保存する。

条件を絞って、[.txt]データに書き出します。

checkitem.js
let fs   = require('fs');

// check item
let json = JSON.parse(fs.readFileSync("checksheet.json"));
let targetItem = [];
json.forEach(function(value,index){
  if(value.住所.match(/大阪/)){
    // console.log(value.url);
    targetItem.push(value.名前+" : "+value.住所+"\n");
  }
});

fs.writeFile('大阪の人.txt',targetItem,function(err){
  let texts = fs.readFileSync('大阪の人.txt','utf-8');
  console.log(texts);
  fs.writeFile('大阪の人.txt',texts.replace(/\,/g,""),function(err){});
});

先ほど書き出した[checksheet.json]を読み込んで、[住所]の項目が[大阪]を含む値を判定。
条件に当てはまったデータを[大阪の人.txt]に書き出し。

$ node checkitem.js

ターミナルからスクリプトを実行

正しく出て来た。

この記事で扱うデータはフィクションです。実在の人物や団体などとは関係ありませ

条件式の使い方次第で色々絞り込めます。
↓生年月日から20代を絞り込みの場合

checkitem.js
//if(value.住所.match(/大阪/)){
if(1998 >= value.生年月日.slice(0,4) && 1989 <= value.生年月日.slice(0,4)){

おわりに

スプシのフィルタ機能でカバーできない様な、痒いところに手が届いた気がしました。
スプシ1行目に空のデータがあると、自動で "field番号":[{値},{..}]が当て込まれるので注意です。

うまく書き換えて、ejsを使ったHTML書き出しにも使えそうです。

出典