データセットの更新

既存データセットの更新

CSVファイル、ZIPパッケージ、またはバイナリファイルから新しいデータを使用して既存のデータセットを更新します。更新ではデータセットIDおよび関連する設定が保持されます。

CSVからデータセットを更新

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/csv

既存のデータセットのデータをCSVファイルの新しいデータに置き換えます。システムはデータセット設定から列マッピングを自動検出します。

パスパラメータ

パラメータ 必須 説明
tenantId GUID はい テナント識別子
projectId GUID はい プロジェクト識別子
datasetId GUID はい 更新対象のデータセット識別子

リクエスト (multipart/form-data)

フィールド 必須 説明
file ファイル はい 新しいデータを含むCSVファイル(最大1GB)
cultureInfo 文字列 いいえ 解析用のカルチャ(デフォルト:"en-US")

レスポンス (200 OK)

{
  "datasetId": "550e8400-e29b-41d4-a716-446655440000",
  "caseCount": 5500,
  "eventCount": 165000,
  "invalidValueCount": 0,
  "skippedRowsCount": 0,
  "errors": [],
  "rowIssues": [],
  "statusCode": 200
}

エラーレスポンス

Bad Request (400):

dataset with id '{datasetId}' not found
can't update '{datasetName}' because it's not an original dataset

ZIPパッケージからデータセットを更新

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/package

既存のデータセットのデータをZIPパッケージの新しいデータに置き換えます。

リクエスト (multipart/form-data)

フィールド 必須 説明
file ファイル はい 新しいデータを含むZIPパッケージファイル(最大1GB)
cultureInfo 文字列 いいえ 解析用のカルチャ(デフォルト:"en-US")

レスポンス (200 OK)

CSV更新のレスポンスと同じ構造。

エラーレスポンス (422 Unprocessable Entity)

{
  "errors": ["Invalid package structure"],
  "rowIssues": [
    {
      "rowIndex": 15,
      "columnName": "Timestamp",
      "errorType": "ParseError",
      "outcome": "Skipped",
      "message": "Unable to parse date value"
    }
  ],
  "statusCode": 422
}

バイナリからデータセットを更新

PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/binary

既存のデータセットのデータをバイナリ形式のファイルの新しいデータに置き換えます。

リクエスト (multipart/form-data)

フィールド 必須 説明
file ファイル はい 新しいデータを含むバイナリファイル(最大1GB)

レスポンス (200 OK)

CSV更新のレスポンスと同じ構造。

更新の制限事項

  • 元のデータセットのみ: 元のデータセットのみ更新可能です。フィルターやその他の変換で派生したデータセットは直接更新できません。
  • 設定の保持: 更新ではデータセットIDおよびすべての関連設定(ノートブック、ブロックなど)が保持されます。
  • 列構造の一貫性: 新しいデータは元のデータセットと同じ列構造である必要があります。

実装例

cURL - CSVからの更新

curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/550e8400-e29b-41d4-a716-446655440000/csv" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@updated_event_log.csv" \
  -F "cultureInfo=en-US"

cURL - ZIPパッケージからの更新

curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/87654321-4321-4321-4321-210987654321/dataset/550e8400-e29b-41d4-a716-446655440000/package" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@updated_data_package.zip" \
  -F "cultureInfo=en-US"

Python

import requests

TENANT_ID = '12345678-1234-1234-1234-123456789012'
PROJECT_ID = '87654321-4321-4321-4321-210987654321'
BASE_URL = 'https://your-mindzie-instance.com'

class DatasetUpdater:
    def __init__(self, token):
        self.headers = {'Authorization': f'Bearer {token}'}

    def update_from_csv(self, dataset_id, file_path, culture='en-US'):
        """CSVファイルからデータセットを更新します。"""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/csv'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'text/csv')}
            data = {'cultureInfo': culture}

            response = requests.put(url, headers=self.headers, files=files, data=data)

        if response.ok:
            return response.json()
        else:
            raise Exception(f'更新に失敗しました: {response.text}')

    def update_from_package(self, dataset_id, file_path, culture='en-US'):
        """ZIPパッケージからデータセットを更新します。"""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/package'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'application/zip')}
            data = {'cultureInfo': culture}

            response = requests.put(url, headers=self.headers, files=files, data=data)

        if response.ok:
            return response.json()
        elif response.status_code == 422:
            result = response.json()
            print(f"検証エラー: {result['errors']}")
            for issue in result.get('rowIssues', []):
                print(f"  行 {issue['rowIndex']}: {issue['message']}")
            raise Exception('データ検証に失敗しました')
        else:
            raise Exception(f'更新に失敗しました: {response.text}')

    def update_from_binary(self, dataset_id, file_path):
        """バイナリファイルからデータセットを更新します。"""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/dataset/{dataset_id}/binary'

        with open(file_path, 'rb') as f:
            files = {'file': (file_path, f, 'application/octet-stream')}

            response = requests.put(url, headers=self.headers, files=files)

        if response.ok:
            return response.json()
        else:
            raise Exception(f'更新に失敗しました: {response.text}')

# 使用例
updater = DatasetUpdater('your-auth-token')

# CSVからの更新
result = updater.update_from_csv(
    '550e8400-e29b-41d4-a716-446655440000',
    'updated_event_log.csv'
)
print(f"更新されたデータセット: {result['datasetId']}")
print(f"新しいケース数: {result['caseCount']}")
print(f"新しいイベント数: {result['eventCount']}")

# 問題の確認
if result['skippedRowsCount'] > 0:
    print(f"警告: {result['skippedRowsCount']} 行がスキップされました")
if result['invalidValueCount'] > 0:
    print(f"警告: {result['invalidValueCount']} 件の無効な値が見つかりました")

JavaScript/Node.js

const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const PROJECT_ID = '87654321-4321-4321-4321-210987654321';
const BASE_URL = 'https://your-mindzie-instance.com';

class DatasetUpdater {
  constructor(token) {
    this.token = token;
  }

  async updateFromCsv(datasetId, file, culture = 'en-US') {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/${datasetId}/csv`;

    const formData = new FormData();
    formData.append('file', file);
    formData.append('cultureInfo', culture);

    const response = await fetch(url, {
      method: 'PUT',
      headers: { 'Authorization': `Bearer ${this.token}` },
      body: formData
    });

    if (response.ok) {
      return await response.json();
    } else if (response.status === 422) {
      const result = await response.json();
      throw new Error(`検証に失敗しました: ${result.errors.join(', ')}`);
    } else {
      throw new Error(`更新に失敗しました: ${await response.text()}`);
    }
  }

  async updateFromPackage(datasetId, file, culture = 'en-US') {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/dataset/${datasetId}/package`;

    const formData = new FormData();
    formData.append('file', file);
    formData.append('cultureInfo', culture);

    const response = await fetch(url, {
      method: 'PUT',
      headers: { 'Authorization': `Bearer ${this.token}` },
      body: formData
    });

    if (response.ok) {
      return await response.json();
    } else {
      const error = await response.json();
      throw new Error(`更新に失敗しました: ${error.errors?.join(', ') || response.statusText}`);
    }
  }
}

// 使用例(ブラウザ)
const updater = new DatasetUpdater('your-auth-token');
const fileInput = document.getElementById('updateFile');

fileInput.addEventListener('change', async (e) => {
  const file = e.target.files[0];
  const datasetId = '550e8400-e29b-41d4-a716-446655440000';

  try {
    const result = await updater.updateFromCsv(datasetId, file);

    console.log(`更新済み: ${result.datasetId}`);
    console.log(`新規ケース数: ${result.caseCount}`);
    console.log(`新規イベント数: ${result.eventCount}`);

    if (result.skippedRowsCount > 0) {
      console.warn(`${result.skippedRowsCount} 行がスキップされました`);
    }
  } catch (error) {
    console.error('更新に失敗しました:', error.message);
  }
});

レスポンスフィールド

フィールド 説明
datasetId GUID 更新されたデータセットのID
caseCount 整数 更新データ内のユニークなケース数
eventCount 整数 更新データ内の合計イベント数
invalidValueCount 整数 検出された無効な値の数
skippedRowsCount 整数 エラーによりスキップされた行数
errors 配列 エラーメッセージのリスト
rowIssues 配列 行レベルの問題に関する詳細情報
statusCode 整数 HTTPステータスコード

行の問題の構造

{
  "rowIndex": 15,
  "columnName": "Timestamp",
  "errorType": "ParseError",
  "outcome": "Skipped",
  "message": "Unable to parse date value '2024-13-45'"
}
フィールド 説明
rowIndex 問題が発生した行番号
columnName 問題の値を含む列名
errorType エラーの種類(ParseError、ValidationErrorなど)
outcome 結果(Skipped, DefaultValueなど)
message 人間が理解できるエラー説明

ベストプラクティス

  • バックアップを優先: 更新前に現在のデータをエクスポートすることを検討してください
  • 構造の確認: 新しいデータが同じ列構造であることを確認してください
  • 結果のチェック: 更新後にrowIssuesskippedRowsCountをレビューしてください
  • 先にテスト: 本番環境以外のデータセットで事前に更新をテストしてください
  • カルチャ設定: 日付や数値フォーマットに適切なカルチャを使用してください