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 기본)와 GNUsed(Linux 기본, macOS에선gsed로 사용 가능) 모두와 호환됩니다. -
CSV 스니퍼가 지원하는 데이터 타입만 제대로 파싱돼요. 중첩 데이터를 담은 값은
VARCHAR로 파싱됩니다.