DE · AT · CHAnleitung

CSV-Austausch mit dem ERP: Zeichensatz, Dezimalzeichen, Schlüssel

Aktualisiert:

Gilt für: Versionunabhängig; gilt für CSV-Import und -Export zwischen ERP, Shop, Kassen und Buchhaltung im DACH-Raum.

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

  1. 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).
  2. Feldzahl je Datensatz vergleichen: Jeder Datensatz soll so viele Felder tragen wie der Kopfdatensatz (RFC 4180, Abschnitt 2 Nr. 3 und 4).
  3. Beträge addieren: Summe je Betragsspalte gegen die Summe im ERP rechnen und das Dezimalzeichen ansehen.
  4. Umlaute und ß an einem Datensatz stichprobenartig prüfen.
  5. Schlüsselfeld prüfen: Länge und erste Zeichen einer Nummer mit führenden Nullen vergleichen.
  6. Datumsfeld prüfen: einen bekannten Wert im Format JJJJ-MM-TT suchen.
  7. Zeichensatz prüfen: die ersten drei Bytes ansehen; EF BB BF ist ein UTF-8-BOM und muss zur Vereinbarung passen.
  8. 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.

Häufige Fragen

Muss die Datei eine Kopfzeile haben?

Nein, sie ist optional. RFC 4180 beschreibt eine Kopfzeile als möglichen ersten Datensatz und sieht für die Übergabe den Parameter header mit den Werten present und absent vor. Entscheidend ist, was der Empfänger erwartet. Prüfen Sie nach dem Import, ob der erste Datensatz als Feldnamen gelesen wurde; dann war die Kopfzeile nicht verabredet oder steht doppelt.

Warum verliert der Import die führenden Nullen?

Weil die Zeichenfolge 000123 als Zahl gelesen wird. Die Datei selbst trägt keinen Datentyp; im Modell für tabellarische Daten steht er als Metadatum der Spalte. Vereinbaren Sie deshalb, dass Schlüsselfelder als Text gelesen werden, und prüfen Sie die feste Länge nach dem Import. GS1 behandelt auch rein numerische Kennungen als Zeichenketten, in denen führende Nullen bedeutsam sind.

Komma oder Semikolon als Trennzeichen?

RFC 4180 definiert das Komma. Mit dem Komma als Trennzeichen ist das Dezimalkomma zulässig, solange das Feld in Anführungszeichen steht: "12,50" trägt genau ein Feld. Ohne diese Maskierung liest der Empfänger fünf Felder statt vier, weil das Dezimalkomma dann als Feldgrenze gilt. Das Semikolon ist eine verabredete Abweichung von der RFC: Eine Datei damit folgt der RFC-Vorgabe nicht, und die Abweichung gehört in die Formatvereinbarung. Entscheidend bleibt, dass Abgeber und Empfänger dasselbe Zeichen eingestellt haben.

Braucht die Datei ein Byte Order Mark?

Nein. Ein UTF-8-BOM ist die Signatur EF BB BF und steht als U+FEFF vor dem ersten Zeichen. Die Unicode-FAQ weist darauf hin, dass ein BOM mit Formaten kollidiert, die am Anfang bestimmte ASCII-Zeichen erwarten; bei einer CSV-Datei mit Kopfzeile passt dann der erste Feldname nicht mehr zur Prüfung. Legen Sie mit dem Empfänger fest, ob das BOM gesetzt wird.

Wie finde ich einen Zeichensatzfehler sofort?

Sehen Sie die ersten Bytes an: EF BB BF ist ein UTF-8-BOM. Zeichenfolgen wie Kräutertee entstehen, wenn UTF-8-Bytes als CP1252 gelesen werden. Prüfen Sie eine Zeile mit Umlaut und ß statt die ganze Datei zu durchsuchen, und stellen Sie danach beide Seiten auf denselben Zeichensatz.

Quellen

  1. RFC 4180: Common Format and MIME Type for Comma-Separated Values (CSV) Files (informativ)RFC Editor (IETF) · abgerufen am
  2. RFC 3629: UTF-8, a transformation format of ISO 10646 (Standards Track, Abschnitt 6 Byte order mark)RFC Editor (IETF) · abgerufen am
  3. RFC 3339: Date and Time on the Internet: Timestamps (Abschnitt 5.6 Internet Date/Time Format)RFC Editor (IETF) · abgerufen am
  4. Encoding Standard (Living Standard, Abschnitt Legacy single-byte encodings: windows-1252 und ihre Labels)WHATWG (Web Hypertext Application Technology Working Group) · abgerufen am
  5. Unicode CLDR, Chart-Summary Deutsch (Numbers: Symbole decimal und group für de, de_CH, de_LI)Unicode Consortium · abgerufen am
  6. UTF-8, UTF-16, UTF-32 & BOM (Frequently Asked Questions zu Byte Order Mark)Unicode Consortium · abgerufen am
  7. Model for Tabular Data and Metadata on the Web, W3C Recommendation vom 17. Dezember 2015 (Datentyp als Metadatum einer Spalte)World Wide Web Consortium (W3C) · abgerufen am
  8. GS1 General Specifications, Release 26.0, Ratified Januar 2026 (Abschnitt 1.2 Kennungen als Zeichenketten, Abschnitt 1.3.1.1 GTIN)GS1 AISBL · abgerufen am