CSV-Austausch mit dem ERP: Zeichensatz, Dezimalzeichen, Schlüssel
Kurz gesagt
Legen Sie für jede CSV-Schnittstelle im DACH-Raum acht Punkte vorher fest: Feldtrennzeichen, Anführungszeichen, Zeichensatz, Dezimalzeichen, Gruppierungszeichen, Datumsformat, Kopfzeile und die Darstellung leerer Felder. RFC 4180 beschreibt Komma, Anführungszeichen und CRLF, lässt den Zeichensatz aber offen; ein Dezimalkomma gehört bei Komma als Trennzeichen in Anführungszeichen. Prüfen Sie nach jedem Lauf Datensatzzahl, Feldzahl je Datensatz, Beträge, Umlaute, führende Nullen und das Datumsfeld gegen die Quelle.
Das Wichtigste
- RFC 4180 ist informativ: Komma als Trennzeichen, Anführungszeichen als Maskierung, CRLF als Zeilenende, Kopfzeile optional.
- Der Zeichensatz steht nicht in der Datei; Abgeber und Empfänger müssen ihn beide einstellen.
- Deutsch: Komma als Dezimalzeichen, Punkt als Gruppierung; in der Schweiz Punkt als Dezimal- und Apostroph als Gruppierungszeichen.
- Datum als JJJJ-MM-TT nach dem Internet-Profil der ISO 8601 (RFC 3339), nicht als TT.MM.JJJJ.
- Führende Nullen gehören zum Schlüssel: Kennungen wie die GTIN gelten als Zeichenketten.
- Nach jedem Lauf prüfen: Datensatzzahl, Feldzahl je Datensatz, Summen, Umlaute, Schlüssellänge und Datum.
Ein CSV-Austausch kann an der Verabredung über das Format scheitern. Die Datei trägt ihre Regeln nicht mit sich: Trennzeichen, Zeichensatz, Dezimalzeichen und Datumsformat liest der Empfänger nach seiner eigenen Einstellung. Wer diese Punkte festhält und nach jedem Lauf eine kurze Prüfliste abarbeitet, findet die Fehler in der eigenen Testumgebung statt beim Empfänger.
Was Sie vorab brauchen
- Die Feldliste beider Seiten: Name, Inhalt, Pflichtfeld und Reihenfolge.
- Eine Formatvereinbarung mit Trennzeichen, Anführungszeichen, Zeichensatz, Dezimalzeichen, Gruppierungszeichen, Datumsformat, Kopfzeile und der Darstellung leerer Felder.
- Eine Beispieldatei je Richtung, die die Gegenseite schon einmal verarbeitet hat.
- Einen Testsatz mit Umlaut und ß, einem Betrag mit Dezimalkomma, einer Nummer mit führenden Nullen und einem Datum.
- Die Import- und Export-Einstellungen Ihres ERP, festgehalten als Ausdruck.
- Ein Werkzeug, das die Datei byteweise anzeigt, und ein CSV-Parser, der Datensätze und Feldzahl je Datensatz zählt.
RFC 4180, die RFC 3629, die RFC 3339, die CLDR-Angaben, die W3C-Empfehlung und die GS1-Spezifikation sind technische Festlegungen. Keine davon ist eine Rechtsvorschrift; verbindlich wird eine von ihnen erst über die Vereinbarung zwischen Abgeber und Empfänger oder über eine Vorgabe des Empfängers.
So sieht eine abgestimmte Datei aus
Die folgende Abgabe ist erfunden; Artikel, Preise und Datum sind frei gewählt. Trennzeichen ist das Semikolon, der Zeichensatz UTF-8 ohne Byte Order Mark, der Betrag trägt ein Dezimalkomma, das Datum steht als JJJJ-MM-TT.
Artikelnummer;Bezeichnung;VK-Preis;Lieferdatum
000123;"Kräutertee ""Winter""; lose";12,50;2026-03-01
100456;Frühstücksmüsli;8,90;2026-03-01
Drei Eigenschaften dieser Datei tragen die Verabredung:
- Das Semikolon weicht von RFC 4180 ab. Die RFC legt das Komma als Feldtrennzeichen fest und registriert den Medientyp text/csv. Mit dem Komma als Trennzeichen müsste das Dezimalkomma in Anführungszeichen stehen (“12,50”); hier ist das Semikolon verabredet, und diese Abweichung gehört in die Formatvereinbarung.
- Anführungszeichen im Wert (“Winter”) sind verdoppelt. So verlangt es die RFC für ein Anführungszeichen innerhalb eines Feldes.
- Der Wert mit dem Trennzeichen (“…; lose”) steht in Anführungszeichen, weil das Semikolon im Feld sonst als Feldgrenze gilt.
Dieselben Daten ohne Verabredung kommen so an:
Artikelnummer;Bezeichnung;VK-Preis;Lieferdatum
000123;Kräutertee lose;12,50;2026-03-01
Die Tabelle ordnet jedem typischen Fehlerfall das sichtbare Ergebnis und die Ursache zu.
| Fehlerfall | In der Datei steht | Angekommen ist | Ursache |
|---|---|---|---|
| Zeichensatz | Kräutertee in UTF-8 | Kräutertee | Datei als CP1252 gelesen, obwohl der Export UTF-8 geschrieben hat |
| Dezimalkomma | 12,50 unmaskiert in einer Datei mit Komma als Trennzeichen | Der Datensatz trägt fünf Felder statt vier | RFC 4180 verlangt Anführungszeichen um ein Feld, das ein Komma enthält; ohne sie gilt das Dezimalkomma als Feldtrennung |
| Gruppierungszeichen | 1.234,50 | Der Wert trägt ein Zeichen, für das die Vereinbarung keine Bedeutung festlegt | Der Punkt steht als Tausenderzeichen im Wert |
| Führende Nullen | 000123 | 123 | Das Feld ohne Datentyp wird als Zahl gelesen |
| Datumsformat | 03.04.2026 | 2026-04-03 oder 2026-03-04 | Reihenfolge Tag und Monat nicht festgelegt |
| Byte Order Mark | unsichtbares U+FEFF vor Artikelnummer | Der Feldname passt nicht zur Kopfzeilenprüfung | Das UTF-8-BOM wurde nicht entfernt |
| Anführungszeichen | Kräutertee “Winter” unmaskiert | Je nach Leser Ablehnung des Datensatzes oder falsch übernommener Wert | Das Feld ist nicht in Anführungszeichen eingeschlossen, und das Anführungszeichen im Wert ist nicht verdoppelt; RFC 4180 Abschnitt 2 Nr. 5 bis 7 legt für einen solchen Verstoß keine einheitliche Reaktion des Lesers fest |
| Zeilenende | LF statt CRLF | Je nach Leser bleiben Datensätze ungetrennt oder die Anzeige weicht ab | RFC 4180 beschreibt CRLF und weist darauf hin, dass andere Implementierungen andere Werte verwenden können |
Schritt für Schritt: die Datei austauschen
Schritt 1: Format schriftlich festlegen
Schreiben Sie zu jedem Punkt der Liste aus dem ersten Abschnitt einen Beispielwert auf, etwa Trennzeichen Semikolon, Zeichensatz UTF-8, Dezimalzeichen Komma, Datum JJJJ-MM-TT. Beide Seiten prüfen dann dieselbe Erwartung statt ihrer Vermutung. RFC 4180 liefert nur einen Teil der Regeln: Komma, Anführungszeichen mit Verdopplung, CRLF am Zeilenende, optionale Kopfzeile und dieselbe Feldzahl in allen Datensätzen. Den Zeichensatz lässt sie offen. Die MIME-Registrierung nennt als übliche Nutzung US-ASCII und überlässt alles Weitere einem charset-Parameter, den die Datei selbst nicht mitführt.
Schritt 2: Zeichensatz einstellen
UTF-8 kodiert die Zeichen des Universal Character Set und behält den ASCII-Bereich bei (RFC 3629). Es ist die Wahl, wenn keine Seite Einschränkungen macht. Ein Empfänger, der nur die Codepage 1252 (CP1252) liest, verliert jedes Zeichen außerhalb dieser Codepage, etwa Buchstaben wie ł oder ř. Prüfen Sie vor dem ersten Lauf, was das Zielsystem liest, und stellen Sie dort denselben Zeichensatz ein, den der Export schreibt.
Der Encoding Standard der WHATWG führt ansi_x3.4-1968 als eines der Labels der windows-1252, daneben unter anderem ascii, latin1 und iso-8859-1; er weist darauf hin, dass diese Labels seit langem verwirren und in diesem Standard Synonyme derselben Codepage sind. Über einen Eintrag, der nur ANSI heißt, sagt der Standard damit nichts. Lesen Sie deshalb im Zielsystem ab, welche Codepage dort hinter dem Eintrag steht, statt aus dem Namen auf die Codepage 1252 zu schließen.
Schritt 3: Betrag und Datum schreiben
Setzen Sie das Dezimalzeichen ausdrücklich in die Vereinbarung. Die CLDR-Übersicht für Deutsch nennt das Komma als Dezimal- und den Punkt als Gruppierungszeichen; für de_CH und de_LI stehen dort der Punkt als Dezimal- und der Apostroph als Gruppierungszeichen. Ein Betrag trägt nur das Dezimalzeichen; ein Gruppierungszeichen fügt dem Wert ein Zeichen hinzu, für das die Vereinbarung sonst keine Bedeutung festlegt.
Schreiben Sie das Datum als JJJJ-MM-TT. Dieses Format ist das Internet-Profil der ISO 8601 in RFC 3339, Abschnitt 5.6; es ordnet Jahr, Monat und Tag von grob nach fein und lässt keine Deutung als MM/TT/JJJJ zu. ISO 8601 ist eine Norm der International Organization for Standardization und keine Rechtsvorschrift; verbindlich wird das Format über die Vereinbarung oder eine Vorgabe des Empfängers.
Schritt 4: Schlüssel als Zeichenkette behandeln
Artikelnummern, GTIN und Kontonummern sind Kennungen, keine Rechengrößen. GS1 behandelt jede Kennung als Zeichenkette, in der auch führende Nullen bedeutsam sind, und verlangt, dass die Nullen einer GTIN-12 in einem Datenbankfeld erhalten bleiben (GS1 General Specifications, Abschnitte 1.2 und 1.3.1.1). Im Modell für tabellarische Daten steht der Datentyp einer Spalte als Metadatum neben der Tabelle, nicht im Feld: Aus der Zeichenfolge 000123 allein ist nicht ablesbar, ob sie als Text oder als Zahl gemeint ist. Vereinbaren Sie deshalb, dass Schlüsselfelder als Text gelesen werden, und prüfen Sie nach dem Import die feste Länge: 000123 hat sechs Stellen, 123 nur drei.
Schritt 5: Sonderzeichen maskieren
Ein Feld in Anführungszeichen darf nach RFC 4180 das Trennzeichen, einen Zeilenumbruch und doppelte Anführungszeichen enthalten; ein Anführungszeichen im Feld wird durch ein zweites Anführungszeichen maskiert (“b”“bb”). Ein Feld ohne Anführungszeichen darf dagegen kein Anführungszeichen enthalten (Abschnitt 2 Nr. 5); fehlt die Feldmaskierung oder die Verdopplung, lässt die RFC die Reaktion des Lesers offen, sodass er den Datensatz je nach Umsetzung ablehnt oder den Wert falsch übernimmt. Leerzeichen sind Teil des Feldes und dürfen nicht als Polsterung gelten. Prüfen Sie nach dem Export, dass jeder Datensatz dieselbe Feldzahl trägt; genau das geht verloren, wenn ein Trennzeichen im Wert unmaskiert bleibt.
Schritt 6: Ausgeben und sofort prüfen
Schreiben Sie jede Datei unter einem festen Namen und halten Sie Quelle, Lauf und Datensatzzahl fest. Prüfen Sie danach in der Reihenfolge des nächsten Abschnitts. Hat Ihr Ausgangssystem einen Import, lesen Sie die erzeugte Datei einmal zurück; zeigt der Rundlauf dieselben Werte, stimmen Format und Feldzuordnung in sich.
So prüfen Sie nach jedem Lauf
- Datensätze zählen: die erwartete Anzahl Datensätze ohne Kopfzeile mit einem CSV-Parser zählen, nicht die physischen Zeilen im Text. RFC 4180 erlaubt in einem Feld in Anführungszeichen einen Zeilenumbruch (Abschnitt 2 Nr. 6) und lässt den letzten Datensatz ohne abschließenden Zeilenumbruch enden (Abschnitt 2 Nr. 2).
- Feldzahl je Datensatz vergleichen: Jeder Datensatz soll so viele Felder tragen wie der Kopfdatensatz (RFC 4180, Abschnitt 2 Nr. 3 und 4).
- Beträge addieren: Summe je Betragsspalte gegen die Summe im ERP rechnen und das Dezimalzeichen ansehen.
- Umlaute und ß an einem Datensatz stichprobenartig prüfen.
- Schlüsselfeld prüfen: Länge und erste Zeichen einer Nummer mit führenden Nullen vergleichen.
- Datumsfeld prüfen: einen bekannten Wert im Format JJJJ-MM-TT suchen.
- Zeichensatz prüfen: die ersten drei Bytes ansehen; EF BB BF ist ein UTF-8-BOM und muss zur Vereinbarung passen.
- Kopfzeile prüfen: den ersten Feldnamen mit dem erwarteten Namen vergleichen; ein unsichtbares Zeichen davor fällt hier auf.
Wenn etwas nicht klappt
| Symptom | Ursache | Abhilfe |
|---|---|---|
| Import bricht mit falscher Spaltenzahl ab | Komma im Betrag oder im Text steht unmaskiert, das Komma gilt als Trennzeichen | Trennzeichen auf beiden Seiten gleich einstellen oder das Feld in Anführungszeichen setzen |
| Umlaute erscheinen als Kräutertee | Datei in UTF-8 geschrieben, in CP1252 gelesen | Zeichensatz auf beiden Seiten auf UTF-8 stellen und den Lauf wiederholen |
| Der erste Feldname der Kopfzeile wird nicht erkannt | BOM vor dem ersten Feldnamen | Export ohne BOM einstellen oder den Leser anweisen, das BOM zu entfernen |
| Artikelnummer 123 statt 000123 | Das Feld wird als Zahl gelesen | Feld als Text führen und die feste Länge prüfen |
| Datum liegt einen Tag oder einen Monat daneben | TT.MM.JJJJ wurde als MM/TT/JJJJ gelesen | Datum als JJJJ-MM-TT schreiben |
| Aus einem Satz werden mehrere Zeilen | Zeilenumbruch im Textfeld ist unmaskiert | Feld in Anführungszeichen setzen |
| Die Zählung meldet einen Datensatz zu wenig | Der letzte Datensatz endet ohne abschließenden Zeilenumbruch (RFC 4180, Abschnitt 2 Nr. 2); eine Zählung, die einen Abschluss erwartet, übersieht ihn | Den letzten Datensatz ohne Zeilenumbruch mitzählen oder eine abschließende Zeile erzeugen |
| Betrag wird je nach Leser als 1,234 oder als 1.234 gedeutet | Im Wert steht ein Gruppierungszeichen, für das die Vereinbarung keine Bedeutung festlegt | Wert ohne Tausenderzeichen schreiben |
Wann Sie Hilfe holen sollten
Holen Sie die Softwarebetreuung dazu, wenn die Exportfunktion Feldtypen nicht einstellen lässt, wenn der Empfänger ein eigenes Format vorgibt oder wenn zwei Systeme dieselbe Datei unterschiedlich lesen. Verlangt ein Handelspartner ein festes Nachrichtenformat, ist eine CSV-Datei die falsche Antwort; dafür gilt EDI für Handelspartner, und wer eine dauerhafte Anbindung statt einer Dateiübergabe plant, prüft die offene ERP-Schnittstelle. Ist das Ziel die Buchhaltung, beschreibt Buchungsstapel aus dem ERP die Feldzuordnung, und Schnittstellen vor dem Start testen ordnet die Testarten. Wer Artikel und Preise verteilt, findet die Verteilung unter Artikelstamm an Filialkassen.