データインポート

複数ソースからのデータインポート

CSV、Excel、JSONなどの形式からデータをインポートします。大規模なデータセットもストリーミングアップロードで対応可能です。

データファイルのアップロード

POST /api/{tenantId}/{projectId}/dataset/{datasetId}/import

CSV、Excel、XESなど様々なファイル形式のデータをアップロードおよびインポートします。チャンク転送による大容量ファイルのアップロードをサポート。

パラメーター

パラメーター 場所 説明
tenantId GUID Path テナント識別子
projectId GUID Path プロジェクト識別子
datasetId GUID Path データセット識別子
file File フォームデータ アップロードするデータファイル
columnMapping JSON フォームデータ カラムマッピング設定

カラムマッピング設定

{
  "mapping": [
    {
      "sourceColumn": "Case_ID",
      "targetColumn": "CaseID",
      "dataType": "string"
    },
    {
      "sourceColumn": "Event_Name",
      "targetColumn": "Activity",
      "dataType": "string"
    },
    {
      "sourceColumn": "Event_Time",
      "targetColumn": "Timestamp",
      "dataType": "datetime",
      "format": "yyyy-MM-dd HH:mm:ss"
    }
  ],
  "options": {
    "hasHeader": true,
    "delimiter": ",",
    "encoding": "UTF-8",
    "skipRows": 0
  }
}

レスポンス

{
  "importId": "import-550e8400-e29b-41d4-a716-446655440000",
  "datasetId": "550e8400-e29b-41d4-a716-446655440000",
  "status": "Processing",
  "fileName": "process_events.csv",
  "fileSize": 15728640,
  "rowsProcessed": 0,
  "rowsTotal": 50000,
  "errors": [],
  "warnings": [],
  "startTime": "2024-01-15T10:30:00Z"
}

マッピング付きCSVインポート

POST /api/{tenantId}/{projectId}/dataset/{datasetId}/import/csv

高度なカラムマッピング、データ変換、および検証オプションを使ったCSVデータのインポート。

リクエストボディ

{
  "fileUrl": "https://your-storage.com/data/events.csv",
  "mapping": [
    {
      "sourceColumn": "order_id",
      "targetColumn": "CaseID",
      "dataType": "string",
      "required": true
    },
    {
      "sourceColumn": "step_name",
      "targetColumn": "Activity",
      "dataType": "string",
      "required": true
    },
    {
      "sourceColumn": "timestamp",
      "targetColumn": "Timestamp",
      "dataType": "datetime",
      "format": "ISO8601",
      "required": true
    },
    {
      "sourceColumn": "user_name",
      "targetColumn": "Resource",
      "dataType": "string",
      "required": false
    }
  ],
  "options": {
    "hasHeader": true,
    "delimiter": ",",
    "encoding": "UTF-8",
    "skipRows": 1,
    "validateData": true,
    "replaceExisting": false
  },
  "transformations": [
    {
      "column": "Activity",
      "type": "replace",
      "find": "ORDER_",
      "replace": "Order "
    }
  ]
}

レスポンス

ファイルアップロードエンドポイントと同様のインポートステータスオブジェクトを返します。

インポートステータスの取得

GET /api/{tenantId}/{projectId}/dataset/{datasetId}/import/{importId}/status

データインポートの進捗および状況を検証結果やエラー詳細を含めて監視します。

レスポンス

{
  "importId": "import-550e8400-e29b-41d4-a716-446655440000",
  "datasetId": "550e8400-e29b-41d4-a716-446655440000",
  "status": "Completed",
  "fileName": "process_events.csv",
  "fileSize": 15728640,
  "rowsProcessed": 49876,
  "rowsTotal": 50000,
  "rowsSkipped": 124,
  "startTime": "2024-01-15T10:30:00Z",
  "endTime": "2024-01-15T10:45:23Z",
  "duration": "00:15:23",
  "errors": [
    {
      "row": 1532,
      "column": "Timestamp",
      "error": "Invalid date format",
      "value": "2024-13-01 25:00:00"
    }
  ],
  "warnings": [
    {
      "row": 2847,
      "column": "Resource",
      "warning": "Empty value for optional field",
      "value": ""
    }
  ],
  "statistics": {
    "uniqueCases": 1247,
    "uniqueActivities": 12,
    "dateRange": {
      "earliest": "2024-01-01T08:00:00Z",
      "latest": "2024-01-31T17:30:00Z"
    }
  }
}

対応ファイル形式

mindzieStudioはシームレスなプロセスマイニングデータインポートのために複数のデータ形式をサポートしています:

CSVファイル

柔軟な解析オプションを備えたカンマ区切り値。

  • カスタム区切り記号(カンマ、セミコロン、タブ)
  • UTF-8、ISO-8859-1エンコーディング対応
  • ヘッダー行の検出
  • クォート文字の処理

Excelファイル

Microsoft Excelワークブック(.xlsx、.xls)。

  • 複数シート対応
  • セルの書式設定保持
  • 日付/時刻認識
  • 大容量ファイルのストリーミング

XESフォーマット

プロセスマイニング向けIEEE XES標準。

  • XES仕様の完全サポート
  • イベント属性および拡張機能
  • ライフサイクル情報
  • プロセスマイニングツールとの互換性

JSONファイル

複雑なイベント向けの構造化JSONデータ。

  • ネストされたオブジェクト対応
  • 配列の処理
  • カスタムスキーママッピング
  • ストリーミングJSON処理

JavaScript例:進捗付きファイルアップロード

class DataImporter {
  constructor(baseUrl, tenantId, projectId, token) {
    this.baseUrl = baseUrl;
    this.tenantId = tenantId;
    this.projectId = projectId;
    this.headers = {
      'Authorization': `Bearer ${token}`
    };
  }

  async uploadFile(datasetId, file, columnMapping) {
    const formData = new FormData();
    formData.append('file', file);
    formData.append('columnMapping', JSON.stringify(columnMapping));

    const url = `${this.baseUrl}/api/${this.tenantId}/${this.projectId}/dataset/${datasetId}/import`;

    const response = await fetch(url, {
      method: 'POST',
      headers: this.headers,
      body: formData
    });

    return await response.json();
  }

  async importCsv(datasetId, csvConfig) {
    const url = `${this.baseUrl}/api/${this.tenantId}/${this.projectId}/dataset/${datasetId}/import/csv`;

    const response = await fetch(url, {
      method: 'POST',
      headers: {
        ...this.headers,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(csvConfig)
    });

    return await response.json();
  }

  async getImportStatus(datasetId, importId) {
    const url = `${this.baseUrl}/api/${this.tenantId}/${this.projectId}/dataset/${datasetId}/import/${importId}/status`;

    const response = await fetch(url, {
      headers: this.headers
    });

    return await response.json();
  }

  async monitorImport(datasetId, importId, callback) {
    const checkStatus = async () => {
      try {
        const status = await this.getImportStatus(datasetId, importId);
        callback(status);

        if (status.status === 'Processing') {
          setTimeout(checkStatus, 2000); // 2秒ごとにチェック
        }
      } catch (error) {
        callback({ error: error.message });
      }
    };

    checkStatus();
  }

  buildStandardMapping() {
    return {
      mapping: [
        {
          sourceColumn: 'case_id',
          targetColumn: 'CaseID',
          dataType: 'string'
        },
        {
          sourceColumn: 'activity',
          targetColumn: 'Activity',
          dataType: 'string'
        },
        {
          sourceColumn: 'timestamp',
          targetColumn: 'Timestamp',
          dataType: 'datetime',
          format: 'ISO8601'
        }
      ],
      options: {
        hasHeader: true,
        delimiter: ',',
        encoding: 'UTF-8',
        validateData: true
      }
    };
  }
}

// 利用例
const importer = new DataImporter(
  'https://your-mindzie-instance.com',
  'tenant-guid',
  'project-guid',
  'your-token'
);

// 進捗監視付きファイルアップロード処理
document.getElementById('fileInput').addEventListener('change', async (e) => {
  const file = e.target.files[0];
  if (!file) return;

  const mapping = importer.buildStandardMapping();

  try {
    const result = await importer.uploadFile('dataset-guid', file, mapping);
    console.log('アップロード開始:', result.importId);

    // 進捗監視
    importer.monitorImport('dataset-guid', result.importId, (status) => {
      if (status.error) {
        console.error('インポート失敗:', status.error);
      } else {
        const progress = (status.rowsProcessed / status.rowsTotal) * 100;
        console.log(`進捗: ${progress.toFixed(1)}% (${status.rowsProcessed}/${status.rowsTotal})`);

        if (status.status === 'Completed') {
          console.log('インポートが正常に完了しました!');
          console.log(`処理済み行数: ${status.rowsProcessed}、エラー数: ${status.errors.length}`);
        }
      }
    });
  } catch (error) {
    console.error('アップロード失敗:', error);
  }
});