インポーター

インポーター(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)

ファイルの構造は、以下のようにしてください:

  • シート名 = リソース名
  • 最初の行 = アトリビュートやフィールドの名前
  • 以下の行 = アトリビュートやフィールドの値

他のリソースへの参照の作り方

  1. 参照先のテーブルの内容が入ったシートをもう一つ作成します。必ず、シートの名前を参照先のテーブルの名前と同じにして、 "uuid" という名前のカラムを持たせてください。
  2. 参照元のシートにカラムを追加して、以下のような形式でカラム名を指定します:
    reference:<フィールド名>:<参照先のテーブル名>

例えば、 "reference:organisation_id:org_organisation" のように書きます。

  1. このカラムと、参照先テーブルの uuid カラムに同じ UUID (Universally Unique ID, 一意なID)を入れます。

コンポーネントの作り方

  1. シートをもう一つ作成します。このテーブルは、必ず以下のような形式の名前にします:
    <メインのテーブル名>+<コンポーネントのテーブル名>

例: "hms_hospital+hms_hactivity"

  1. コンポーネント側のシートにカラムを追加して、以下のような形式の名前にします:
    <メインのテーブル名>.<キーのフィールド名>

例: "hms_hospital.gov_uuid"
=> キーのフィールドは、メインのテーブル上のフィールドにします
=> キーのフィールドはメインのテーブル上で一意な値(プライマリキー)でなければなりません。

  1. キーフィールドの値を、コンポーネントが参照しているメインのテーブルのエントリのキーフィールドの対応する値と同じにしてください。

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 測度を使ってレコード行の類似性を調べます。同じような内容のレコードが見つかると、別のスプレッドシートインタフェースに表示します。ユーザはこのレコードを編集したり削除したりしてから、データベースに取り込めます。重複レコード中のエラーも、前述したのと同じ形式で表示されます。

インポートの手順

デモビデオ

  1. スプレッドシートのインポート
    • インポーターはhttp://<web address>/<application name>/importerでアクセスします。ここがインポーターを操作するときの出発点です。
    • 「スプレッドシート」をクリックします。
    • スプレッドシートをアップロードします。スプレッドシートの名前と、必要ならコメントを入力します。
    • Tips:
      • スプレッドシート内のワークシートは一つだけにしましょう。
      • レコードの行数を 100 程度に押さえましょう。行数が増えると、ページの生成や処理に時間がかかり、サーバーへのリクエストがタイムアウトすることがあります(100行というのは制限ではなく、ページの表示やインポート処理の負荷を考えたときの目安にすぎません。インターネット接続の速さも考慮に入れましょう。オフラインで操作している場合は、行数はほぼ問題になりません)。
  1. スプレッドシートの編集
    • この手順で、スプレッドシートの内容を変更できます。セルの内容を編集したり、行の追加・削除を行えます。
    • データを検索できます。検索を行うと、スプレッドシート中に最初に検索語が現れた場所に移動します。セル中の文字列の一部にもマッチします。
    • 行を削除するには、行の右側にある×をクリックします。
    • 各行の左のチェックボックスを使って行を選択します。ツールバーの「削除(delete)」ボタンををクリックすると、選択した行を削除します。一度に1つの行しか選択できません。
    • 「インポート」をクリックする前に、スプレッドシート中の各カラムのタイトルが入った行(ヘッダ行)を選択してください。この操作をしないと、選択するよう促されます。
  1. モジュールとリソースの選択
    • この手順では、スプレッドシートのインポートウィザードに二つのセクションが表示されます。
    • 左側のパネルには Sahana Eden に組み込まれているモジュールの一覧が表示されます。リストからモジュールを一つ選んでください。
    • モジュールを選ぶと、右側のパネルには、モジュール上のリソースが表示されます。リソースを一つ選んでください。
    • 「次へ(next)」ボタンをクリックすると、選択したモジュールはサーバーからリソースやフィールドの値を取得します。サーバーの性能にもよりますが、しばらく時間がかかります。我慢してじっと待ちましょう。
  1. カラムとフィールドの対応付け
    • この手順では、手順2で選択したカラムタイトルがドロップダウンで表示されます。
    • ドロップダウンは、手順3選択したリソースのフィールドと並べて表示されます。フィールドは、以下の2種類に分かれます:
      • 通常のフィールド。
      • 参照フィールド。Eden のデータベーススキーマ中の別のテーブルを指しているフィールドです。ドロップダウンリストの中では、「<フィールド名> --> <リソース名> --> <入れ子のリソース中のフィールド名>」 という形式で表示されます。

従って、 org_staff 中の人物 (person) への参照は、ドロップダウンでは「 person_id --> pr_person --> first_name」のように表示されます。

  • 全てのカラムを何らかのフイールドに対応付けせねばなりませんさもないと、次に進めません。
  • スプレッドシートからデータが抽出され、データベースにインポートするために処理されます。
  1. 無効なレコードの編集
    • データベースには、一定の規則に従って検証ずみのレコードしか入りません。
    • データベースの規定している検証を通らないレコード行のインポートは拒否されます。インポートを行わせるには、全てのフィールドに正しい形式の値が入っていなくてはなりません。
    • スプレッドシートには、エラーになったレコードだけが表示されます。検証に失敗したフィールドが赤色表示されています。このフィールドには、検証に失敗した値が入っています。
    • 「 <フィールド名>: <エラー名> . You entered <入力した値> 」という形式のエラーが表示されます。メッセージ全体を正しい値に置き換えてください。
    • インポートしたくないレコードは削除しておいてください。
    • 「インポート」をクリックして、次の手順に進みます。
  1. 類似レコードの編集
    • レコード数の多いスプレッドシートには、同じような内容のレコードが複数入っていることがあります。スプレッドシートインポーターは、類似のレコードを検出します。
    • 類似レコードはスプレッドシート形式で表示されます。スプレッドシート中で、(1 行目と 2行目, 3行目 と 4行目のように) となり合う二つのレコードが類似レコードです。
    • 類似レコードの内容は好きなように編集できます。インポートするときに、カラムタイトルを選択する必要はありません
    • 「インポート」ボタンを押してレコードをインポートします。
  1. (類似レコードで、かつ)無効なレコードの編集
    • 類似レコード中のフィールドにエラーがある場合、手順 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

Comments