Node.jsでいろんな形式のデータを扱う
注意事項
以下のファイルの文字コードはすべてUTF-8で実装しているので、Windows環境などでは、日本語が 文字化けする可能性があります。それらを踏まえた上で、テスト用のテキストなどに日本語 を使うことは避けていますが、やはり、環境によっては上手くいかないことがあることを ご理解ください。
対象となるデータ形式
1. JSON
javaScriptrといえばJSONですね。
下のようなdata.json
を用意しました。
{ "title" : "-- programming --", "languages" : [ {"id":1000, "name":"Java"}, {"id":1001, "name":"Ruby"}, {"id":1002, "name":"PHP"}, {"id":1003, "name":"Python"}, {"id":1004, "name":"JavaScript"} ] }
そして、こちらが上のJSONファイルを読み込んだり、パースしたりする
json_read.js
です。
var fs = require('fs'); var json_data = fs.readFileSync("data.json", "utf-8"); var obj = JSON.parse(json_data); console.log(obj.title); for (var i in obj.languages) { console.log(obj.languages[i].name); }
node json_read.js
で実行すると、プログラミング言語がずらっと表示されるはずです。
非常に簡単ですね。
javaScriptのオブジェクトをJSONのデータに変換するには
var json_data = JSON.Stringify(obj);
とします。JSON.parse(json_data);
と対になっていると考えると理解しやすいです。
2. XML / RSS
node.jsでXMLを扱うには、xml2js
やcheerio
というモジュールを使います。
ここでは、jQueryライクにDOMへアクセスできるcheerio
の方を使います。
cheerio
は
npm install cheerio
でインストールすることができます。
XMLは、data.xml
というファイルを用意しました。
<item> <name>pen</name> <price>120</price> </item> <item> <name>note</name> <price>150</price> </item> <item> <name>book</name> <price>540</price> </item>
これを扱うファイルをxml_read.js
として作成します。
var fs = require('fs'), che = require('cheerio'); var xml_data = fs.readFileSync("data.xml", "utf-8"); $ = che.load(xml_data); $("item").each(function(i, el) { var name = $(this).children("name").text(); var price = $(this).children("price").text(); console.log(name + " : " + price); });
node xml_read.js
と実行すると、モノと、その値段が表示されるはずです。
直観的にわかるかもしれませんが、cheerio
モジュールのload()
でXMLファイルをパースしたものが、
$
に入っています。そのあとは、jQueryのような構文で各要素の中身を取得していく感じになります。
3. CSV
node.jsでCSV形式のファイルを扱うにはcomma-separated-values
というモジュールが要ります。
npm install comma-separated-values
でインストールできます。
以下はdata.csv
になります。
ID, Name, Birthday 1000, Alice, 19990201 1001, Bell, 20010609 1002, Clara, 20001230
CSVファイルを扱うファイルが以下のcsv_read.js
です。
var fs = require('fs'), CSV = require('comma-separated-values'); var csv_data = fs.readFileSync("data.csv", "utf-8"); var data = new CSV(csv_data, {header:false}); var rec = data.parse(); for (var i = 0; i < rec.length; i++) { console.log(rec[i][0] + " : " + rec[i][1]); }
node csv_read.js
で実行すると、IDと名前が表示されます。
1行目のヘッダ部分がいらない、という場合には、パース直後に、
rec.shift();
と書けば、配列の先頭要素が削除されるので上手い具合になります。
まとめ
どのファイル形式を扱うにしても
- モジュールを読み込む
- fsのreadFileSync()を使ってデータを読み込む
- 読み込んだモジュールを使ってデータをパースする
- パースしたデータから必要な部分を取得したり、出力したりする
といった大まかな流れは変わりません。
また、基本的にnode.jsには便利なモジュールが多く、それらはほとんどnpm
で取得できます。なにか行いたい
場合、先に使えそうなモジュールがないか調べるのも手であることを覚えておきましょう。
参考
Node.jsでSQLite3を使ってみる
環境
- Ubuntu16.04
- Node.js v7.7.1
- npm 4.1.2
SQLite3をnpmでインストール
node.jsはサーバサイドでjavascriptを扱えるようにしたもの。当然、データベースも扱うことが
できます。
今回はSQLiteというデータベースを使ってみます。ほかの選択肢としてはmongoDBなんかがあるみたいですね。
SQLiteはnpmを使ってインストールすることができます。
npm install sqlite3
実行時のディレクトリにnode_modules
というディレクトリができて、さらになかにsqlite3
というディレクトリ
が入ったはずです。
データを挿入する
SQLiteを直接立ち上げて、コマンドでテーブル定義などを行っても良いですが、今回は
sqlite-insert.js
というスクリプトファイルを作成し、それを実行する過程でテーブル
定義などを行いつつ、データも挿入することにします。
var sqlite = require('sqlite3').verbose(); var db = new sqlite.Database('test.sqlite'); db.serialize(function() { // テーブルがなければ作成 db.run('CREATE TABLE IF NOT EXISTS students(name TEXT, age INT)'); // プリペアードステートメントでデータ挿入 var stmt = db.prepare('INSERT INTO students VALUES(?,?)'); stmt.run(["Tanaka", 12]); stmt.run(["Sato", 13]); stmt.run(["Nakamura", 15]); stmt.finalize(); }); db.close();
studentsテーブルは名前と年齢を管理するテーブルです。本当はIDなんかをつけた方が
良いのですが、今回はテストなので省略します。
実行はnode sqlite-insert.js
でできます。
プリペアードステートメントについては、以前MySQLで書いた記事があるので、そちらを参考にしてみてください。
データを取得する
つづいて、データベースからデータを取得するスクリプトを書いてみます。
ファイル名はsqlite-fetch.js
とでもしておきましょう。
var sqlite = require('sqlite3').verbose(); var db = new sqlite.Database('test.sqlite'); db.serialize(function() { db.each("SELECT * FROM students", function(err, row) { console.log(row.name + ":" + row.age); }); }); db.close();
node sqlite-fetch.js
で実行します。
見ての通り、ターミナルにデータを表示するだけです。取得の際コールバック関数を
使っているのがnodeっぽいですよね。
いつのまにかtest.sqlite
というファイルができているかと思いますが、そこに挿入した
データが入っています。
参考
Expressを使ってみる
Expressってなに
Node.jsのウェブアプリケーションフレームワークです。Node.jsのフレームワークはKoaや RailsライクなSailsなんかがありますが、おそらくExpressがもっとも有名ではないかと 思います。
準備
- 環境:macOS Sierra10.12.3
とりあえず本家サイトのインストール手順にしたがって環境を整えます。
mkdir express_test cd express_test npm init
express_test
というディレクトリを作成、そこへ移動。npm init
でpackage.json
というファイルを
つくります。このコマンドを実行すると、いろいろ質問されますが、一つの質問を除いては、ただリターンキー(エンターキー)
を押していくだけで良いです。
例外の質問とは
entry point: (index.js)
という項目です。
ここでは、メインのファイル名を入力します。今回はapp.js
としました。
上手くpackage.json
が作成されれば、次のコマンドでExpressをインストールします。
npm install express --save
グローバルでインストールしても良かったのですが、動かなかったときが怖いので、express_test
のディレクトリ内
にのみ入れました。
ハローワールド
メインファイルであるapp.js
を作成し、次のように書きます。
var express = require('express') var app = express() app.get('/', function (req, res) { res.send('Hello, Express!!') }) app.listen(3000, function () { console.log('Listening on port 3000!') })
作成したら、ターミナルで
node app.js
と実行します。
ブラウザのURL欄にhttp://localhost:3000/
と打ち込んで
Hello, Express!!
と出力されれば成功です。