Zum Inhalt springen

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:

Terminal window
echo -n > duckbox-cleaned.csv
sed -n "2s/^│ *//;s/ *│$//;s/ *│ */│/p;2q" duckbox.csv >> duckbox-cleaned.csv
sed "1,4d;\$d;s/^│ *//;s/ *│$//;s/ *│ */│/g" duckbox.csv >> duckbox-cleaned.csv

Die Datei duckbox-cleaned.csv sieht wie folgt aus:

a│b
hello│42
world│84

Anschließ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,b
hello,42
world,84

Verwendung 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');

shellfs ist 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 als gsed verfügbar) kompatibel.

  • Nur die vom CSV-Sniffer unterstützten Datentypen werden korrekt geparst. Werte mit verschachtelten Daten werden als VARCHAR geparst.