今回は、Node.jsでCSVを扱うためのプログラミング手法について学習をしていきましょう!
「CSVファイルってどうやって読み込めば良いの?」
「CSVからJSONに変換したい」
「CSVを簡単に扱う方法が知りたい」
このような内容も含めて、本記事では以下のような構成で解説していきます!
【基礎】「CSV」の読み込み方
【実践】「CSV」からJSONに変換
【実践】「CSV」の自動生成
この記事で、CSVをしっかり学習してスキルアップを目指していきましょう!
「CSV」とは?
「CSV(Comma Separated Value)」は、データをカンマ区切りで分けたテキストファイルの形式です。
さまざまなアプリケーションで利用できる汎用性の高さが特徴で、例えばExcelのデータをCSVで書き出したり逆にCSVをExcelで読み込むこともできます。
一般的にCSVの中身は次のように文字列とカンマで表現されています。
名前,年齢,電話番号,都道府県 太郎,30,090-1111-2222,東京都 花子,28,080-2222-3333,埼玉県 田中,25,080-3333-4444,神奈川県
1行目が見出しになり、それぞれの行がデータのまとまりになっています。
また、各行の最後にあるデータにはカンマが付きません。
(改行は必ずしも必要ではありません)
本記事では、Node.jsからCSVを生成したりJSONに変換するようなプログラミングについて詳しく学んでいきます!
「CSV」の読み込み
この章では、Node.jsからCSVファイルを読み込む方法について見ていきましょう!
主に、csvモジュールの導入からCSVデータの準備、読み込み方法について学んでいきます。
「csv」モジュールの導入
それでは、Node.jsでCSVを操作する方法について見ていきましょう!
一般的なCSVデータを効率よく扱うために、今回は「CSV」モジュールを利用していきます。
そこで、まずはnpmからCSVモジュールをインストールしておきます。
npm install csv
あとは、Node.jsから扱えるようにrequire()を使って次のように記述しておきましょう!
const fs = require('fs'); const csv = require('csv');
今回はCSVファイルを読み込むので、ファイル操作ができる標準のfsモジュールも一緒に準備しておきましょう。
CSVデータの準備
次に、Node.jsから読み込むためのCSVファイルを準備しましょう!
冒頭でも解説しましたが、CSVはテキストをカンマ区切りで表現したファイルになります。
そこで、「test.csv」というファイル名で次のように記述しておきます。
名前,年齢,電話番号,都道府県 太郎,30,090-1111-2222,東京都 花子,28,080-2222-3333,埼玉県 田中,25,080-3333-4444,神奈川県
これで、3人分の「名前・年齢・電話番号・都道府県」が記録されたCSVファイルができました。
CSVファイルの読み込み方法について
それでは、CSVモジュールを利用して読み込むプログラムを作っていきましょう!
と言っても、ファイルを読み込むだけならfsモジュールだけでも可能です。
fs.createReadStream(__dirname + '/public/test.csv') .pipe(process.stdout);
実行結果
名前,年齢,電話番号,住所 太郎,30,090-1111-2222,東京都 花子,28,080-2222-3333,埼玉県 田中,25,080-3333-4444,神奈川県
この例では、fsモジュールで提供されている「createReadStream()」を使ってtest.csvファイルを読み込んでいます。
pipe()を利用してCSVの中身を出力しているのが分かりますね。
ただし、このままだとNode.jsから扱いにくいデータになっているのでcsvモジュールを使って解析をしてみましょう!
次のサンプル例を見てください!
fs.createReadStream(__dirname + '/public/test.csv') .pipe(csv.parse(function(err, data) { console.log(data); }));
実行結果
[ [ '名前', '年齢', '電話番号', '住所' ], [ '太郎', '30', '090-1111-2222', '東京都' ], [ '花子', '28', '080-2222-3333', '埼玉県' ], [ '田中', '25', '080-3333-4444', '神奈川県' ] ]
「createReadStream()」でファイルを読み込むのは同じなのですが、その後に続くpipe()の中身が違いますね。
「csv.parse()」を利用してファイルの中身を解析したうえで、Node.jsからでも扱いやすい配列形式に変換されているのが分かります。
「CSV」のJSON変換
この章では、CSVをJSON形式のデータに変換する方法について見ていきましょう!
主に、CSVからオブジェクトへの変換、およびJSONへの変換方法について学んでいきます。
CSVをオブジェクトに変換する方法
それでは、CSVをJSON形式に変換していきましょう!
考え方としては単純で、CSV形式のデータをまずはオブジェクトに変換します。
そうすれば、JSON.stringify()メソッドで簡単にJSON形式に変換できるわけです。
csvモジュールを使うとオブジェクトへの変換は簡単で、「csv.parse()」にオプションを設定するだけです!
fs.createReadStream(__dirname + '/public/test.csv') .pipe(csv.parse({columns: true}, function(err, data) { console.log(data); }));
実行結果
[ { '名前': '太郎', '年齢': '30', '電話番号': '090-1111-2222', '住所': '東京都' }, { '名前': '花子', '年齢': '28', '電話番号': '080-2222-3333', '住所': '埼玉県' }, { '名前': '田中', '年齢': '25', '電話番号': '080-3333-4444', '住所': '神奈川県' } ]
オプションとして「columns: true」を設定しているのが分かるでしょうか?
たったこれだけで、配列形式で出力されていたCSVがオブジェクト形式に変換されているのが実行結果からも分かりますね。
オブジェクトをJSONに変換する方法
今度は、オブジェクトに変換されたCSVをJSONに変換してみましょう!
方法は簡単で、最終的に取得できるオブジェクトデータをJSON.stringify()で変換するだけです。
次のサンプル例を見てください!
fs.createReadStream(__dirname + '/public/test.csv') .pipe(csv.parse({columns: true}, function(err, data) { console.log(JSON.stringify(data)); }));
実行結果
[{"名前":"太郎","年齢":"30","電話番号":"090-1111-2222","住所":"東京都"},{"名前":"花子","年齢":"28","電話番号":"080-2222-3333","住所":"埼玉県"},{"名前":"田中","年齢":"25","電話番号":"080-3333-4444","住所":"神奈川県"}]
「csv.parse()」内の関数処理にて、JSON.stringify()でオブジェクトからJSON形式に変換しているのが実行結果からも分かりますね。
このようにcsvモジュールを利用すると、Node.jsからCSVを効率よく扱えるようになるので便利です。
「CSV」の自動生成について
csvモジュールの機能として、実はゼロからCSVを自動的に生成する機能があるので合わせて解説をしておきます。
利用するのは「csv.generate()」メソッドで、生成したCSVはこれまでと同じように解析や変換を行うことも可能です。
次のサンプル例を見てください!
csv.generate({length: 3,max_word_length:5}) .pipe(csv.parse(function(err, data) { console.log(data); }));
実行結果
[ [ 'L', 'ccP', 'noa', 'h', 'Ga', 'bOb', 'blf', 'Mb' ], [ 'CFGIe', 'KnnO', 'CLH', 'lMf', 'oLfF', 'e', 'na', 'kLpM' ], [ 'gb', 'be', 'JLGPC', 'OFCbd', 'BBb', 'bnDI', 'dcg', 'LiI' ] ]
この例では、csv.generate()にオプションとして次の2つを追記しています。
・length: 3(生成するCSVの行の数)
・max_word_length: 5(各データ文字列の最大長さ)
これにより1つずつのデータが最大5文字の3行で構成されたCSVが生成されるわけです。
このCSVデータはこれまでと同様にオブジェクトに変えて、そのままJSON形式に変換することも可能です!
csv.generate({length: 3,max_word_length:5}) .pipe(csv.parse({columns: true}, function(err, data) { console.log(JSON.stringify(data)); }));
実行結果
[{"nkc":"FkDNh","dM":"c","p":"Cgp","hkl":"jDCo","f":"HdP","JakF":"LNb","Bk":"M","lm":"AB"},{"nkc":"HoEmI","dM":"JP","p":"eIcpj","hkl":"eMEej","f":"NNA","JakF":"cibII","Bk":"KPGap","lm":"FAL"}]
このようにJSONデータをプログラムから生成することも可能なので、サンプルのJSONファイルを用意するのに最適でしょう。
まとめ
今回は、Node.jsからCSVを扱うための手法について学習しました!
最後に、もう一度ポイントをおさらいしておきましょう!
・csvモジュールを利用することで効率よくCSVを扱うことができる
・CSVはオブジェクトに変換したあとにJSON形式へ再変換する
・csv.generate()を利用するとCSVデータを自動生成できる
上記内容を踏まえて、ぜひ自分でもプログラミングに取り入れて活用できるように頑張りましょう!