Dataset-Aktualisierungen
Bestehende Datensätze aktualisieren
Aktualisieren Sie bestehende Datensätze mit neuen Daten aus CSV-Dateien, ZIP-Paketen oder Binärdateien. Aktualisierungen behalten die Dataset-ID und zugehörige Konfigurationen bei.
Datensatz aus CSV aktualisieren
PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/csv
Ersetzt die Daten in einem bestehenden Datensatz durch neue Daten aus einer CSV-Datei. Das System erkennt automatisch die Spaltenzuordnungen aus der Dataset-Konfiguration.
Pfadparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
tenantId |
GUID | Ja | Die Mandanten-ID |
projectId |
GUID | Ja | Die Projekt-ID |
datasetId |
GUID | Ja | Die zu aktualisierende Dataset-ID |
Anfrage (multipart/form-data)
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
file |
Datei | Ja | CSV-Datei mit neuen Daten (max. 1GB) |
cultureInfo |
string | Nein | Kultur für die Analyse (Standard: "en-US") |
Antwort (200 OK)
{
"datasetId": "550e8400-e29b-41d4-a716-446655440000",
"caseCount": 5500,
"eventCount": 165000,
"invalidValueCount": 0,
"skippedRowsCount": 0,
"errors": [],
"rowIssues": [],
"statusCode": 200
}
Fehlerantworten
Bad Request (400):
dataset with id '{datasetId}' not found
can't update '{datasetName}' because it's not an original dataset
Datensatz aus ZIP-Paket aktualisieren
PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/package
Ersetzt die Daten in einem bestehenden Datensatz durch neue Daten aus einem ZIP-Paket.
Anfrage (multipart/form-data)
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
file |
Datei | Ja | ZIP-Paketdatei mit neuen Daten (max. 1GB) |
cultureInfo |
string | Nein | Kultur für die Analyse (Standard: "en-US") |
Antwort (200 OK)
Gleiche Struktur wie bei CSV-Aktualisierungsantwort.
Fehlerantwort (422 Unprocessable Entity)
{
"errors": ["Invalid package structure"],
"rowIssues": [
{
"rowIndex": 15,
"columnName": "Timestamp",
"errorType": "ParseError",
"outcome": "Skipped",
"message": "Unable to parse date value"
}
],
"statusCode": 422
}
Datensatz aus Binärdatei aktualisieren
PUT /api/{tenantId}/{projectId}/dataset/{datasetId}/binary
Ersetzt die Daten in einem bestehenden Datensatz durch neue Daten aus einer Binärdatei.
Anfrage (multipart/form-data)
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
file |
Datei | Ja | Binärdatei mit neuen Daten (max. 1GB) |
Antwort (200 OK)
Gleiche Struktur wie bei CSV-Aktualisierungsantwort.
Aktualisierungseinschränkungen
- Nur Original-Datensätze: Es können nur Original-Datensätze aktualisiert werden. Aus Filtern oder anderen Transformationen abgeleitete Datensätze können nicht direkt aktualisiert werden.
- Konfiguration beibehalten: Aktualisierungen behalten die Dataset-ID und alle zugehörigen Konfigurationen (Notebooks, Blöcke usw.) bei.
- Spaltenkonsistenz: Die neuen Daten sollten dieselbe Spaltenstruktur wie der Original-Datensatz aufweisen.
Implementierungsbeispiele
cURL – Aktualisierung aus 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 – Aktualisierung aus ZIP-Paket
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'):
"""Aktualisiert den Datensatz aus einer CSV-Datei."""
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'Aktualisierung fehlgeschlagen: {response.text}')
def update_from_package(self, dataset_id, file_path, culture='en-US'):
"""Aktualisiert den Datensatz aus einem ZIP-Paket."""
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"Validierungsfehler: {result['errors']}")
for issue in result.get('rowIssues', []):
print(f" Zeile {issue['rowIndex']}: {issue['message']}")
raise Exception('Datenvalidierung fehlgeschlagen')
else:
raise Exception(f'Aktualisierung fehlgeschlagen: {response.text}')
def update_from_binary(self, dataset_id, file_path):
"""Aktualisiert den Datensatz aus einer Binärdatei."""
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'Aktualisierung fehlgeschlagen: {response.text}')
# Anwendung
updater = DatasetUpdater('your-auth-token')
# Aktualisierung aus CSV
result = updater.update_from_csv(
'550e8400-e29b-41d4-a716-446655440000',
'updated_event_log.csv'
)
print(f"Datensatz aktualisiert: {result['datasetId']}")
print(f"Neue Fallanzahl: {result['caseCount']}")
print(f"Neue Ereignisanzahl: {result['eventCount']}")
# Überprüfung auf Probleme
if result['skippedRowsCount'] > 0:
print(f"Warnung: {result['skippedRowsCount']} Zeilen wurden übersprungen")
if result['invalidValueCount'] > 0:
print(f"Warnung: {result['invalidValueCount']} ungültige Werte gefunden")
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(`Validierung fehlgeschlagen: ${result.errors.join(', ')}`);
} else {
throw new Error(`Aktualisierung fehlgeschlagen: ${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(`Aktualisierung fehlgeschlagen: ${error.errors?.join(', ') || response.statusText}`);
}
}
}
// Verwendung (Browser)
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(`Aktualisiert: ${result.datasetId}`);
console.log(`Neue Fälle: ${result.caseCount}`);
console.log(`Neue Ereignisse: ${result.eventCount}`);
if (result.skippedRowsCount > 0) {
console.warn(`Übersprungene Zeilen: ${result.skippedRowsCount}`);
}
} catch (error) {
console.error('Aktualisierung fehlgeschlagen:', error.message);
}
});
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
datasetId |
GUID | ID des aktualisierten Datensatzes |
caseCount |
integer | Anzahl der eindeutigen Fälle in den aktualisierten Daten |
eventCount |
integer | Gesamtanzahl der Ereignisse in den aktualisierten Daten |
invalidValueCount |
integer | Anzahl entdeckter ungültiger Werte |
skippedRowsCount |
integer | Anzahl der wegen Fehlern übersprungenen Zeilen |
errors |
array | Liste von Fehlermeldungen |
rowIssues |
array | Detaillierte Informationen zu zeilenbezogenen Problemen |
statusCode |
integer | HTTP-Statuscode |
Struktur der Zeilenprobleme
{
"rowIndex": 15,
"columnName": "Timestamp",
"errorType": "ParseError",
"outcome": "Skipped",
"message": "Unable to parse date value '2024-13-45'"
}
| Feld | Beschreibung |
|---|---|
rowIndex |
Zeilennummer mit dem Problem |
columnName |
Spalte mit dem problematischen Wert |
errorType |
Art des Fehlers (ParseError, ValidationError usw.) |
outcome |
Geschehenes Ergebnis (Skipped, DefaultValue usw.) |
message |
Menschenlesbare Fehlerbeschreibung |
Best Practices
- Zuerst sichern: Erwägen Sie, die aktuellen Daten vor Aktualisierungen zu exportieren
- Struktur prüfen: Stellen Sie sicher, dass die neuen Daten dieselbe Spaltenstruktur haben
- Ergebnisse prüfen: Überprüfen Sie
rowIssuesundskippedRowsCountnach Aktualisierungen - Zuerst testen: Testen Sie Aktualisierungen zunächst an einem Nicht-Produktiv-Datensatz
- Kultureinstellungen: Verwenden Sie die korrekte Kultur für Datums- und Zahlenformate