CSV-Laden, also das Importieren von CSV-Dateien in die Datenbank, ist eine sehr häufige und dennoch überraschend knifflige Aufgabe. CSVs wirken oberflächlich einfach, enthalten aber oft Unstimmigkeiten, die das Laden erschweren. CSV-Dateien kommen in vielen Varianten vor, sind oft beschädigt und haben kein Schema. Der CSV-Reader muss mit all diesen Situationen zurechtkommen.
Der DuckDB-CSV-Reader kann die zu verwendenden Konfigurationsflags automatisch ableiten, indem er die CSV-Datei mit dem CSV-Sniffer analysiert. Das funktioniert in den meisten Fällen korrekt und sollte der erste Versuch sein. In seltenen Fällen, in denen der CSV-Reader die richtige Konfiguration nicht findet, können Sie den Reader manuell so einstellen, dass die CSV-Datei korrekt geparst wird. Weitere Informationen finden Sie auf der Seite zur Autoerkennung.
Parameter
Unten stehen Parameter, die Sie an die Funktion read_csv übergeben können. Wo sinnvoll, lassen sich dieselben Parameter auch an die COPY-Anweisung übergeben.
Name
Beschreibung
Typ
Standard
all_varchar
Typerkennung überspringen und annehmen, dass alle Spalten den Typ VARCHAR haben. Diese Option wird nur von der Funktion read_csv unterstützt.
BOOL
false
allow_quoted_nulls
Die Umwandlung gequoteter Werte in NULL-Werte zulassen
Größe der Puffer zum Lesen von Dateien, in Bytes. Muss groß genug sein, um vier Zeilen zu fassen, und kann die Leistung deutlich beeinflussen.
BIGINT
16 * max_line_size
columns
Spaltennamen und -typen als Struct (z. B. {'col1': 'INTEGER', 'col2': 'VARCHAR'}). Diese Option deaktiviert die automatische Schemaerkennung.
STRUCT
(leer)
comment
Zeichen, das Kommentare einleitet. Zeilen, die mit einem Kommentarzeichen beginnen (optional nach Leerzeichen), werden vollständig ignoriert; andere Zeilen mit einem Kommentarzeichen werden nur bis zu diesem Punkt geparst.
VARCHAR
(leer)
compression
Verfahren zum Komprimieren von CSV-Dateien. Standardmäßig wird das anhand der Dateiendung erkannt (z. B. verwendet t.csv.gz gzip, t.csv verwendet none). Optionen sind none, gzip, zstd.
VARCHAR
auto
dateformat
Datumsformat, das beim Parsen und Schreiben von Daten verwendet wird.
VARCHAR
(leer)
date_format
Alias für dateformat; nur in der COPY-Anweisung verfügbar.
VARCHAR
(leer)
decimal_separator
Dezimaltrennzeichen für Zahlen.
VARCHAR
.
delim
Trennzeichen zwischen Spalten innerhalb einer Zeile, z. B. ,;\t. Das Trennzeichen kann bis zu 4 Bytes lang sein, z. B. 🦆. Alias für sep.
VARCHAR
,
delimiter
Alias für delim; nur in der COPY-Anweisung verfügbar.
VARCHAR
,
escape
Zeichenkette zum Escapen des quote-Zeichens innerhalb gequoteter Werte.
VARCHAR
"
encoding
Kodierung der CSV-Datei. Optionen sind utf-8, utf-16, latin-1. Nicht in der COPY-Anweisung verfügbar (die immer utf-8 verwendet).
VARCHAR
utf-8
filename
Pfad der enthaltenden Datei als Zeichenketten-Spalte namens filename zu jeder Zeile hinzufügen. Relativ- oder Absolutpfade werden je nach dem an read_csv übergebenen Pfad oder Glob-Muster zurückgegeben, nicht nur Dateinamen. Seit DuckDB v1.3.0 wird die Spalte filename automatisch als virtuelle Spalte ergänzt; diese Option bleibt nur aus Kompatibilitätsgründen.
BOOL
false
files_to_sniff
Anzahl der Dateien, die der CSV-Sniffer zur Schemaerkennung beim Lesen mehrerer Dateien verwendet. Setzen Sie den Wert auf -1, um alle Dateien zu sniffen.
BIGINT
10
force_not_null
Werte in den angegebenen Spalten nicht mit der NULL-Zeichenkette abgleichen. Ist die NULL-Zeichenkette leer (Standard), werden leere Werte als Zeichenketten der Länge null statt als NULL gelesen.
VARCHAR[]
[]
header
Die erste Zeile jeder Datei enthält die Spaltennamen.
Zeilenumbruchzeichen. Optionen sind '\r','\n' oder '\r\n'. Der CSV-Parser unterscheidet nur zwischen ein- und zweizeichenigen Zeilentrennern. Daher wird zwischen '\r' und '\n' nicht differenziert.
VARCHAR
(leer)
normalize_names
Spaltennamen normalisieren. Dabei werden alle nicht-alphanumerischen Zeichen entfernt. Spaltennamen, die reservierte SQL-Schlüsselwörter sind, erhalten den Unterstrich (_) als Präfix.
BOOL
false
null_padding
Fehlende Spalten rechts mit NULL-Werten auffüllen, wenn einer Zeile Spalten fehlen.
Trennzeichen zwischen Spalten innerhalb einer Zeile, z. B. ,;\t. Das Trennzeichen kann bis zu 4 Bytes lang sein, z. B. 🦆. Alias für delim.
VARCHAR
,
skip
Anzahl der Zeilen, die am Anfang jeder Datei übersprungen werden.
BIGINT
0
store_rejects
Zeilen mit Fehlern überspringen und in der Rejects-Tabelle speichern.
BOOL
false
strict_mode
Legt die Striktheit des CSV-Readers fest. Bei true wirft der Parser bei Problemen einen Fehler. Bei false versucht der Parser, strukturell fehlerhafte Dateien zu lesen. Das Lesen strukturell fehlerhafter Dateien kann Mehrdeutigkeiten verursachen; verwenden Sie diese Option daher mit Vorsicht.
BOOL
true
thousands
Zeichen zur Kennzeichnung von Tausendertrennzeichen in numerischen Werten. Es muss ein einzelnes Zeichen sein und sich von der Option decimal_separator unterscheiden.
VARCHAR
(leer)
timestampformat
Zeitstempelformat, das beim Parsen und Schreiben von Zeitstempeln verwendet wird.
VARCHAR
(leer)
timestamp_format
Alias für timestampformat; nur in der COPY-Anweisung verfügbar.
VARCHAR
(leer)
types oder dtypes oder column_types
Spaltentypen, entweder als Liste (nach Position) oder als Struct (nach Name). Siehe Beispiel.
VARCHAR[] oder STRUCT
(leer)
union_by_name
Spalten aus verschiedenen Dateien nach Spaltenname statt nach Position ausrichten. Diese Option erhöht den Speicherverbrauch.
BOOL
false
Tip Der CSV-Reader von DuckDB unterstützt die Kodierungen UTF-8 (Standard), UTF-16 und Latin-1.
Für andere Kodierungen können Sie die Erweiterung encodings
verwenden oder sie z. B. mit dem Kommandozeilenwerkzeug iconv umwandeln:
Der Standardwert der Option auto_type_candidates ist ['NULL', 'BOOLEAN', 'BIGINT', 'DOUBLE', 'TIME', 'DATE', 'TIMESTAMP', 'VARCHAR'].
CSV-Funktionen
read_csv versucht automatisch, die richtige Konfiguration des CSV-Readers mit dem CSV-Sniffer zu ermitteln. Außerdem leitet es die Typen der Spalten automatisch ab. Hat die CSV-Datei einen Header, werden die dort gefundenen Namen als Spaltennamen verwendet. Andernfalls heißen die Spalten column0, column1, column2, .... Ein Beispiel mit der Datei flights.csv:
SELECT*FROM read_csv('flights.csv');
FlightDate
UniqueCarrier
OriginCityName
DestCityName
1988-01-01
AA
New York, NY
Los Angeles, CA
1988-01-02
AA
New York, NY
Los Angeles, CA
1988-01-03
AA
New York, NY
Los Angeles, CA
Der Pfad kann relativ (zum aktuellen Arbeitsverzeichnis) oder absolut sein.
Mit read_csv können Sie auch eine persistente Tabelle anlegen:
Mehrere Dateien können Sie auf einmal lesen, indem Sie ein Glob oder eine Dateiliste angeben. Weitere Informationen finden Sie im Abschnitt zu mehreren Dateien.
Schreiben mit der COPY-Anweisung
Die COPY-Anweisung lädt Daten aus einer CSV-Datei in eine Tabelle. Die Syntax entspricht der in PostgreSQL. Um die Daten mit COPY zu laden, müssen Sie zuerst eine Tabelle mit dem richtigen Schema anlegen (passend zur Reihenfolge der Spalten in der CSV-Datei und mit Typen, die zu den Werten in der CSV-Datei passen). COPY erkennt die Konfigurationsoptionen der CSV automatisch.
CREATETABLEontime (
flightdate DATE,
uniquecarrier VARCHAR,
origincityname VARCHAR,
destcityname VARCHAR
);
COPY ontime FROM'flights.csv';
SELECT*FROM ontime;
flightdate
uniquecarrier
origincityname
destcityname
1988-01-01
AA
New York, NY
Los Angeles, CA
1988-01-02
AA
New York, NY
Los Angeles, CA
1988-01-03
AA
New York, NY
Los Angeles, CA
Das CSV-Format können Sie auch manuell über die Konfigurationsoptionen von COPY angeben.
Der CSV-Reader beachtet die Konfigurationsoptionpreserve_insertion_order, um die Einfügereihenfolge zu erhalten.
Bei true (Standard) entspricht die Reihenfolge der Zeilen im Ergebnis der Reihenfolge der entsprechenden Zeilen aus der bzw. den Datei(en).
Bei false ist die Reihenfolge nicht garantiert.
CSV-Dateien schreiben
DuckDB kann CSV-Dateien mit der Anweisung COPY ... TO schreiben.
Dies ist eine inoffizielle Website und nicht mit DuckDB verbunden. Offizielle Seite:duckdb.org.duckdb.ubitools.com · Übersetzt und erstellt mit Astro und daisyUI