Import von Duckbox-Tabellen
Die auf dieser Seite bereitgestellten Skripte funktionieren unter Linux, macOS und WSL.
Standardmäßig stellt der DuckDB-CLI-Client Abfrageergebnisse im duckbox-Format dar, das reichhaltige, von ASCII-Art inspirierte Tabellen zur Anzeige der Daten verwendet. Diese Tabellen werden oft unverändert in anderen Dokumenten geteilt. Nehmen wir zum Beispiel die Tabelle, mit der neue CSV-Funktionen im Blogbeitrag zur DuckDB-v1.2.0-Veröffentlichung demonstriert wurden:
┌─────────┬───────┐│ a │ b ││ varchar │ int64 │├─────────┼───────┤│ hello │ 42 ││ world │ 84 │└─────────┴───────┘Was, wenn wir diese Daten wieder in DuckDB laden möchten?
Das wird standardmäßig nicht unterstützt, lässt sich aber mit etwas Skripting erreichen:
Wir können die Tabelle in eine │-getrennte Datei umwandeln und sie mit dem CSV-Reader von DuckDB lesen.
Beachten Sie, dass das Trennzeichen nicht das Pipe-Zeichen | ist, sondern das Zeichen „Box Drawings Light Vertical“ │.
Laden von Duckbox-Tabellen in DuckDB
Zuerst speichern wir die obige Tabelle als duckbox.csv.
Anschließend bereinigen wir sie mit sed:
echo -n > duckbox-cleaned.csvsed -n "2s/^│ *//;s/ *│$//;s/ *│ */│/p;2q" duckbox.csv >> duckbox-cleaned.csvsed "1,4d;\$d;s/^│ *//;s/ *│$//;s/ *│ */│/g" duckbox.csv >> duckbox-cleaned.csvDie Datei duckbox-cleaned.csv sieht wie folgt aus:
a│bhello│42world│84Anschließend können wir sie einfach so in DuckDB laden:
FROM read_csv('duckbox-cleaned.csv', delim = '│');Und als CSV exportieren:
COPY (FROM read_csv('duckbox-cleaned.csv', delim = '│')) TO 'out.csv';a,bhello,42world,84Verwendung von shellfs
Um Duckbox-Tabellen mit einem einzigen read_csv-Aufruf – und ohne temporäre Dateien – zu parsen, können wir die Community-Erweiterung shellfs verwenden:
INSTALL shellfs FROM community;LOAD shellfs;FROM read_csv( '(sed -n "2s/^│ *//;s/ *│$//;s/ *│ */│/p;2q" duckbox.csv; ' || 'sed "1,4d;\$d;s/^│ *//;s/ *│$//;s/ *│ */│/g" duckbox.csv) |', delim = '│' );Wir können auch ein Tabellen-Makro anlegen:
CREATE MACRO read_duckbox(path) AS TABLE FROM read_csv( printf( '(sed -n "2s/^│ *//;s/ *│$//;s/ *│ */│/p;2q" %s; ' || 'sed "1,4d;\$d;s/^│ *//;s/ *│$//;s/ *│ */│/g" %s) |', path, path ), delim = '│' );Das Lesen einer Duckbox-Tabelle ist dann so einfach wie:
FROM read_duckbox('duckbox.csv');
shellfsist eine Community-Erweiterung und wird ohne Support oder Garantien bereitgestellt. Verwenden Sie sie nur, wenn Sie sicherstellen können, dass die Eingaben angemessen bereinigt (sanitized) sind. Weitere Details finden Sie auf der Seite DuckDB absichern.
Einschränkungen
Beachten Sie die folgenden Einschränkungen, wenn Sie dieses Skript ausführen:
-
Dieser Ansatz funktioniert nur, wenn die Tabelle keine langen Pipe-Zeichen
│enthält. Außerdem werden Leerzeichen aus den Tabellenzellenwerten entfernt. Berücksichtigen Sie diese Annahmen, wenn Sie das Skript ausführen. -
Das Skript ist sowohl mit BSD-
sed(Standard unter macOS) als auch mit GNU-sed(Standard unter Linux und unter macOS alsgsedverfügbar) kompatibel. -
Nur die vom CSV-Sniffer unterstützten Datentypen werden korrekt geparst. Werte mit verschachtelten Daten werden als
VARCHARgeparst.