Realmデータベースファイルから、CSVを一括出力できるプログラムソース全文(Node.js)

はじめに

Realmデータベースとは

・Realmデータベースとは、iPhoneやAndroidなどのモバイルアプリケーション開発に特化した軽量で高速なデータベースエンジン。
・各アプリのrealmファイルはスマートフォン自体に保存されていることがある。
・アプリの主要なデータをrealmが持っていることもあれば、サーバへのキャッシュのみが管理されている場合もある。

プログラムの概要

機能概要と目的

このプログラムは、RealmデータベースファイルからCSVファイルへデータをエクスポートする機能を持っている。
Realmデータベースを開き、スキーマ情報を基にテーブルごとにCSVファイルを生成する。
目的(用途)としては、データのバックアップや他のシステムへの移行、Realmファイル単体は取得したが開発環境等がなく、一般的な(Excel等の)編集可能なファイル・テキスト形式だけ取得しなおしたい、などが想定される。

使用される技術とモジュール(プログラム実行の前提)

このプログラムの実行には、Node.jsが必要である(JavaScriptを主にサーバーサイドで実行するためのプラットフォーム)。
プログラムを動かす前に、Node.jsの公式サイトからインストールし、環境を整える必要があるNode.jsの実行環境がすでに整っていることを前提としているためご注意。
インストール方法の例(外部サイト)
また「realm」「csvWriter」というモジュールを使用する(インストール方法詳細は後述)。

ソースコード全文

以下がソース。自由に利用・改変していただいて問題ない。詳細な実行方法を知りたい方はこの後の「実行までのながれ」をご参照いただきたい。

// 必要なモジュールをインポート
const Realm = require('realm');
const fs = require('fs');
const path = require('path');
const csvWriter = require('csv-writer');

// RealmデータベースファイルからCSVファイルへエクスポートする非同期関数を定義
async function exportRealmToCsv(realmPath) {
    // 指定されたパスでRealmデータベースを開きます。
    const realm = await Realm.open({ path: realmPath });
    // データベースのスキーマ(テーブル定義)を取得します。
    const schema = realm.schema;

    // スキーマ内の各テーブルに対して処理
    schema.forEach(async (table) => {
        // テーブル内の全データを取得します。
        const data = realm.objects(table.name);
        // テーブルのプロパティ名(カラム名)を取得
        const header = Object.keys(table.properties);

        // CSVファイルを書き出すためのWriterを設定
        const writer = csvWriter.createObjectCsvWriter({
            path: path.join(__dirname, `${table.name}.csv`),
            header: header.map((name) => ({ id: name, title: name })),
        });

        // データをCSVフォーマットに変換
        const records = data.map((record) => {
            const row = {};
            header.forEach((name) => {
                row[name] = record[name];
            });
            return row;
        });

        // CSVファイルを書き出し
        await writer.writeRecords(records);
        console.log(`${table.name}.csv has been created.`);
    });

    // データベースを閉じる
    realm.close();
}

// コマンドライン引数からRealmファイルのパスを取得し、パスが指定されていなければエラーを出力
if (process.argv.length < 3) {
    console.error('Please provide the path to the .realm file as an argument.');
    process.exit(1);
}

// コマンドライン引数から取得したRealmファイルのパスを変数に格納
const realmPath = process.argv[2];
// 定義した関数を使用して、RealmファイルからCSVへのエクスポート処理を実行
exportRealmToCsv(realmPath);

実行までのながれ

<留意事項>
・Windows環境を前提として説明。
・前章「使用される技術とモジュール(プログラム実行の前提)」のとおり、事前にNode.jsをインストールしている必要がある。
・これから作成する各フォルダ名、ファイル名は全角文字を使用しても(多分)問題ないが、フォルダパスも含めすべて半角英数字のほうが望ましい。

作業用フォルダを作成

適当なディレクトリにフォルダを作成する(例:「C:\temp\REALMTOCSV」※以降の説明では、このフォルダ名を使用し、また以降紹介するファイルはここで作成したフォルダに格納すること)

*フォルダを作成。

jsファイルの作成

前章「ソースコード全文」をテキストファイルにコピーペーストして、作業用フォルダに保存。保存後、拡張子は「.js」と(javascriptファイルとして保存)すること。(例:「export-realm-to-csv.js」※以降の説明では、このファイル名を使用する)。

*export-realm-to-csv.jsファイルを作成。

realmファイルの用意

csvを出力したいrealmファイルを準備し、作業用フォルダに格納する(以下の例ではdefault.realm)。

*jsファイルと同じ作業用フォルダにrealmファイルを格納。画像ではアイコンがカラフルなもの(realmstudioというアプリのアイコン)になっているが、無地のものになっていても問題ない。

batファイルの作成および実行(1)_必要なモジュールのインポート

以下をテキストファイルにコピーペーストして、作業用フォルダに保存。保存後、拡張子は「.bat」と(Windowsコマンドライン実行ファイルとして保存)すること。(例:「install.bat」※以降の説明では、このファイル名を使用する)。なお、この作業は一回行い、後述のcsvファイルの作成まで完了した後は削除して問題ない)。

npm install realm csv-writer
pause

ファイルを実行。「node_modules」フォルダが作成される。

package.json、package-lock.jsonなどのファイルも同時に作成されることがあるがとくに気にする必要はなし。

batファイルの作成および実行(2)_jsの実行

以下をテキストファイルにコピーペーストして、作業用フォルダに保存。保存後、拡張子は「.bat」と(Windowsコマンドライン実行ファイルとして保存)すること。(例:「DoJs.bat」※以降の説明では、このファイル名を使用する)。なお、「default.realm」は適宜CSVを取り出したいrealmファイルの名前に書き換えること。

cd C:\temp\REALMTOCSV
node export-realm-to-csv.js default.realm
pause

*batファイルを作成。同じフォルダに「realm」「bat」「js」「node_modules」4つのファイル・フォルダが出来上がっているはずである。

実行イメージ(CSVの出力)

プログラム(前述の例では「DoJs.bat」)を実行すれば、realmファイルで保存されているCSVファイルが出力される。

※csv出力例。「default.realm.lock」というファイルが作られる場合があるが、排他制御用の一時ファイルなので削除して問題ない。
あとはcsvファイルを開き、データを取得して適宜活用する。文字化けに注意。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です