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 rowIssues und skippedRowsCount nach Aktualisierungen
  • Zuerst testen: Testen Sie Aktualisierungen zunächst an einem Nicht-Produktiv-Datensatz
  • Kultureinstellungen: Verwenden Sie die korrekte Kultur für Datums- und Zahlenformate