データセットの更新
既存データセットの更新
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 |
人間が理解できるエラー説明 |
ベストプラクティス
- バックアップを優先: 更新前に現在のデータをエクスポートすることを検討してください
- 構造の確認: 新しいデータが同じ列構造であることを確認してください
- 結果のチェック: 更新後に
rowIssuesとskippedRowsCountをレビューしてください - 先にテスト: 本番環境以外のデータセットで事前に更新をテストしてください
- カルチャ設定: 日付や数値フォーマットに適切なカルチャを使用してください