インポーター(Importer)
スプレッドシート(表計算ファイル)からのインポート
インポートできる形式は以下の 3 種類です:
- Open Office (推奨)
- CSV
- Excel 形式 (対話式 UI でインポート、まだ不完全)
Open Office
(OpenOfficeなどで作成される)'.fods' 形式のスプレッドシートからデータをインポートできます。
スプレッドシートは複雑なデータ構造のリソースを表現できるため、データのインポートに最適です。
Webから:
Web2Pyコマンドラインインタフェースを使う場合:
resource = s3xrc.define_resource("hms", "hospital")
template = os.path.join(request.folder, resource.XSLT_PATH, "fods", "import.xsl")
resource.import_xml("myhospitals.fods", template=template)
ファイルの構造は、以下のようにしてください:
- シート名 = リソース名
- 最初の行 = アトリビュートやフィールドの名前
- 以下の行 = アトリビュートやフィールドの値
他のリソースへの参照の作り方
- 参照先のテーブルの内容が入ったシートをもう一つ作成します。必ず、シートの名前を参照先のテーブルの名前と同じにして、 "uuid" という名前のカラムを持たせてください。
- 参照元のシートにカラムを追加して、以下のような形式でカラム名を指定します:
reference:<フィールド名>:<参照先のテーブル名>
例えば、 "reference:organisation_id:org_organisation" のように書きます。
- このカラムと、参照先テーブルの uuid カラムに同じ UUID (Universally Unique ID, 一意なID)を入れます。
コンポーネントの作り方
- シートをもう一つ作成します。このテーブルは、必ず以下のような形式の名前にします:
<メインのテーブル名>+<コンポーネントのテーブル名>
例: "hms_hospital+hms_hactivity"
- コンポーネント側のシートにカラムを追加して、以下のような形式の名前にします:
<メインのテーブル名>.<キーのフィールド名>
例: "hms_hospital.gov_uuid"
=> キーのフィールドは、メインのテーブル上のフィールドにします
=> キーのフィールドはメインのテーブル上で一意な値(プライマリキー)でなければなりません。
- キーフィールドの値を、コンポーネントが参照しているメインのテーブルのエントリのキーフィールドの対応する値と同じにしてください。
CSV
CSV (カンマ区切り)形式のスプレッドシートからデータをインポートできます。ただし、適切にデータを配置しておく必要があります。
リソースごとでなく、テーブルごとに1つのシートが必要です。外部キーは数字のIDにせねばなりません。そのため、準備にはやや手間がかかります。
インポートはコマンドラインから実行できます (以下は、private/import の下の 'volunteers.csv' というファイルの例です):
import_file = os.path.join(request.folder, "private", "import", "volunteers.csv")
table.import_from_csv_file(open(import_file, "r"))
Web UI を使うには、以下のようにします (注: チェック必要):
対話式 UI による Excel 形式のインポート
概要
- 現状のスプレッドシートインポーターには、 .XLS ファイルのデータを Sahana Eden データベースに取り込む機能が一応備わっています。
- インポーターはスプレッドシートに似たインタフェースを備えていて、ブラウザの中でスプレッドシートを編集できます。
- org_staff の pr_person のように、他のリソースから参照を受けているリソースもインポートできます。
- 検証に失敗したレコードはデータベースには取り込まれません。取り込まれなかったレコードはスプレッドシートインタフェース上で表示されます。このとき、いずれかのフィールドが赤色表示されています。このフィールドには、検証に失敗した値が入っています。また、「 <フィールド名>: <エラー名> . You entered <入力した値> 」という形式のエラーが表示されます。レコードを修正すれば、再度インポートできます。
- スプレッドシートインポーターは、 Jaro-Winkler 測度を使ってレコード行の類似性を調べます。同じような内容のレコードが見つかると、別のスプレッドシートインタフェースに表示します。ユーザはこのレコードを編集したり削除したりしてから、データベースに取り込めます。重複レコード中のエラーも、前述したのと同じ形式で表示されます。
インポートの手順
デモビデオ
- スプレッドシートのインポート
- インポーターはhttp://<web address>/<application name>/importerでアクセスします。ここがインポーターを操作するときの出発点です。
- 「スプレッドシート」をクリックします。
- スプレッドシートをアップロードします。スプレッドシートの名前と、必要ならコメントを入力します。
- Tips:
- スプレッドシート内のワークシートは一つだけにしましょう。
- レコードの行数を 100 程度に押さえましょう。行数が増えると、ページの生成や処理に時間がかかり、サーバーへのリクエストがタイムアウトすることがあります(100行というのは制限ではなく、ページの表示やインポート処理の負荷を考えたときの目安にすぎません。インターネット接続の速さも考慮に入れましょう。オフラインで操作している場合は、行数はほぼ問題になりません)。
- スプレッドシートの編集
- この手順で、スプレッドシートの内容を変更できます。セルの内容を編集したり、行の追加・削除を行えます。
- データを検索できます。検索を行うと、スプレッドシート中に最初に検索語が現れた場所に移動します。セル中の文字列の一部にもマッチします。
- 行を削除するには、行の右側にある×をクリックします。
- 各行の左のチェックボックスを使って行を選択します。ツールバーの「削除(delete)」ボタンををクリックすると、選択した行を削除します。一度に1つの行しか選択できません。
- 「インポート」をクリックする前に、スプレッドシート中の各カラムのタイトルが入った行(ヘッダ行)を選択してください。この操作をしないと、選択するよう促されます。
- モジュールとリソースの選択
- この手順では、スプレッドシートのインポートウィザードに二つのセクションが表示されます。
- 左側のパネルには Sahana Eden に組み込まれているモジュールの一覧が表示されます。リストからモジュールを一つ選んでください。
- モジュールを選ぶと、右側のパネルには、モジュール上のリソースが表示されます。リソースを一つ選んでください。
- 「次へ(next)」ボタンをクリックすると、選択したモジュールはサーバーからリソースやフィールドの値を取得します。サーバーの性能にもよりますが、しばらく時間がかかります。我慢してじっと待ちましょう。
- カラムとフィールドの対応付け
- この手順では、手順2で選択したカラムタイトルがドロップダウンで表示されます。
- ドロップダウンは、手順3選択したリソースのフィールドと並べて表示されます。フィールドは、以下の2種類に分かれます:
- 通常のフィールド。
- 参照フィールド。Eden のデータベーススキーマ中の別のテーブルを指しているフィールドです。ドロップダウンリストの中では、「<フィールド名> --> <リソース名> --> <入れ子のリソース中のフィールド名>」 という形式で表示されます。
従って、 org_staff 中の人物 (person) への参照は、ドロップダウンでは「 person_id --> pr_person --> first_name」のように表示されます。
- 全てのカラムを何らかのフイールドに対応付けせねばなりませんさもないと、次に進めません。
- スプレッドシートからデータが抽出され、データベースにインポートするために処理されます。
- 無効なレコードの編集
- データベースには、一定の規則に従って検証ずみのレコードしか入りません。
- データベースの規定している検証を通らないレコード行のインポートは拒否されます。インポートを行わせるには、全てのフィールドに正しい形式の値が入っていなくてはなりません。
- スプレッドシートには、エラーになったレコードだけが表示されます。検証に失敗したフィールドが赤色表示されています。このフィールドには、検証に失敗した値が入っています。
- 「 <フィールド名>: <エラー名> . You entered <入力した値> 」という形式のエラーが表示されます。メッセージ全体を正しい値に置き換えてください。
- インポートしたくないレコードは削除しておいてください。
- 「インポート」をクリックして、次の手順に進みます。
- 類似レコードの編集
- レコード数の多いスプレッドシートには、同じような内容のレコードが複数入っていることがあります。スプレッドシートインポーターは、類似のレコードを検出します。
- 類似レコードはスプレッドシート形式で表示されます。スプレッドシート中で、(1 行目と 2行目, 3行目 と 4行目のように) となり合う二つのレコードが類似レコードです。
- 類似レコードの内容は好きなように編集できます。インポートするときに、カラムタイトルを選択する必要はありません。
- 「インポート」ボタンを押してレコードをインポートします。
- (類似レコードで、かつ)無効なレコードの編集
- 類似レコード中のフィールドにエラーがある場合、手順 5 と同様の形式で表示されます。
- 手順 5 と同様にして、エラーのあるレコードを編集できます。
制限事項:
- 同じスプレッドシートは繰り返しインポートできません。繰り返しインポートを試みると、重複したデータができたり、データのインポートが部分的にうまくいかなかったりします。
- 以下に示したようなバグがあります。
既知のバグと改善点:
- JavaScript?のコードから console.log を除去する必要があります。デバッグ中はとても便利なものなので、プロジェクトのマージ後に除去する予定です。また、リダイレクションもコメントアウトされていて、インポーターがマージされたら除去します。
- organisation_id --> org_organisation --> comments の対応付けが、うまくいくときと行かない時があります。
- 入れ子になったリソースの表現方法を検討する必要があります。
- インポートウィザードの各ステージの UI を改良する必要があります。
OpenStreetMap
病院やロケーションを Sahana Eden にインポートするための XSLT(XML Stylesheet Language Transformations - XMLファイルの形式を変換するためのテンプレート) があります。
”http://[サイトアドレス]/eden/hms/hospital/create.osm?filename=[osmファイルの場所]”というリクエストを行う事でosm形式のデータをsahanaにインポートする事ができます。
ToDo: Provide a UI to select which levels the admin boundary levels correspond to:
Ushahidi
Ushahidi のレポートを Sahana Eden のインシデントレポートシステムにインポートするための XSLT があります。
参考
UserGuidelines