Duckbox 테이블 가져오기

Duckbox 테이블 가져오기 (Importing Duckbox Tables)

이 페이지의 스크립트는 Linux, macOS, WSL에서 동작해요.

기본적으로 DuckDB CLI 클라이언트는 쿼리 결과를 duckbox 형식으로 렌더링합니다. 이 형식은 리치하고 ASCII 아트풍의 표를 써서 데이터를 보여주죠. 이 표는 종종 다른 문서에 그대로 공유되곤 해요. 예를 들어 DuckDB v1.2.0 릴리스 블로그 포스트에서 새 CSV 기능을 시연할 때 쓰인 표가 있습니다.

┌─────────┬───────┐
│    a    │   b   │
│ varchar │ int64 │
├─────────┼───────┤
│ hello   │    42 │
│ world   │    84 │
└─────────┴───────┘

이 데이터를 다시 DuckDB로 불러오고 싶다면 어떨까요? 기본적으로는 지원되지 않지만 약간의 스크립팅으로 가능해져요. 표를 로 구분된 파일로 바꾼 뒤 DuckDB의 CSV 리더로 읽으면 됩니다. 여기서 구분자는 파이프 문자 |가 아니라 "Box Drawings Light Vertical" 문자라는 점에 주의하세요.

Duckbox 테이블을 DuckDB로 로드하기 (Loading Duckbox Tables to DuckDB)

먼저 위 표를 duckbox.csv로 저장합니다. 그다음 sed로 정리해요.

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

duckbox-cleaned.csv 파일은 다음과 같이 됩니다.

a│b
hello│42
world│84

그리고 이걸 DuckDB로 간단히 로드할 수 있어요.

FROM read_csv('duckbox-cleaned.csv', delim = '│');

CSV로 내보낼 수도 있죠.

COPY (FROM read_csv('duckbox-cleaned.csv', delim = '│')) TO 'out.csv';
a,b
hello,42
world,84

shellfs 사용 (Using shellfs)

임시 파일을 만들지 않고 read_csv 한 번만으로 duckbox 표를 파싱하려면, shellfs 커뮤니티 확장을 쓰면 됩니다.

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 = '│'
    );

테이블 매크로로도 만들 수 있어요.

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 = '│'
        );

그러면 duckbox 표를 읽는 게 아주 단순해져요.

FROM read_duckbox('duckbox.csv');

shellfs는 커뮤니티 확장이라 지원이나 보증이 제공되지 않아요. 입력이 적절히 위생 처리(sanitize)됐다고 보장할 수 있을 때만 사용하세요. 자세한 내용은 Securing DuckDB 페이지를 확인하세요.

제약 사항 (Limitations)

이 스크립트를 실행할 때 다음 제약을 고려하세요.

  • 이 방식은 표에 긴 파이프 문자가 없을 때만 동작해요. 또 표 셀 값의 공백도 잘라냅니다. 스크립트를 실행할 때 이 가정들을 반드시 감안해야 해요.

  • 스크립트는 BSD sed(macOS 기본)와 GNU sed(Linux 기본, macOS에선 gsed로 사용 가능) 모두와 호환됩니다.

  • CSV 스니퍼가 지원하는 데이터 타입만 제대로 파싱돼요. 중첩 데이터를 담은 값은 VARCHAR로 파싱됩니다.

더 알아보기 (Learn more)