Excel 가져오기

Excel 가져오기 (Excel Import)

DuckDB는 Excel .xlsx 파일을 읽을 수 있어요. 단, .xls 파일은 지원되지 않는다는 점을 기억하세요. 이 페이지에서 시트 읽기, 특정 범위 읽기, 타입 감지까지 하나씩 살펴볼게요.

출처: DuckDB 공식 문서 — excel-import

Excel 시트 가져오기 (Importing Excel Sheets)

쿼리의 FROM 절에서 read_xlsx 함수를 사용해요.

SELECT * FROM read_xlsx('test_excel.xlsx');

혹은 read_xlsx 함수를 생략하고, DuckDB가 확장자에서 알아서 판단하게 할 수도 있어요.

SELECT * FROM 'test_excel.xlsx';

하지만 가져오기 동작을 제어하는 옵션을 넘기고 싶다면 read_xlsx 함수를 사용해야 해요.

그런 옵션 중 하나가 sheet 매개변수예요. 읽을 Excel 워크시트의 이름을 지정할 수 있죠.

SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

기본적으로 시트를 지정하지 않으면 첫 번째 시트를 읽어요.

특정 범위 가져오기 (Importing a Specific Range)

특정 셀 범위를 선택하려면 range 매개변수에 A1:B2 형식의 문자열을 넘겨요. 여기서 A1은 왼쪽 위 셀, B2는 오른쪽 아래 셀이에요.

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'A1:B2');

예를 들어 처음 5행을 건너뛰려면 이렇게 해요.

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'A5:Z');

처음 5열을 건너뛰려면 이렇게 해요.

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'E:Z');

range 매개변수를 제공하지 않으면, DuckDB는 연속된 비어 있지 않은 셀의 첫 행과 같은 열에 걸쳐있는 첫 번째 빈 행 사이의 사각형 영역을 범위로 자동 추론해요.

기본적으로 범위를 제공하지 않으면 DuckDB는 빈 행을 만나면 Excel 파일 읽기를 멈춰요. 하지만 범위를 제공하면 기본적으로 범위 끝까지 읽죠. 이 동작은 stop_at_empty 매개변수로 제어할 수 있어요.

-- 처음 100행, 또는 첫 빈 행까지 읽기 (둘 중 먼저 오는 것)
SELECT * FROM read_xlsx('test_excel.xlsx', range = '1:100', stop_at_empty = true);

-- 빈 행이 있어도 항상 시트 전체 읽기
SELECT * FROM read_xlsx('test_excel.xlsx', stop_at_empty = false);

새 테이블 만들기 (Creating a New Table)

쿼리 결과로 새 테이블을 만들려면 SELECT 문에서 CREATE TABLE ... AS를 사용해요.

CREATE TABLE new_tbl AS
    SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

기존 테이블에 로드하기 (Loading to an Existing Table)

쿼리 결과를 기존 테이블에 넣으려면 SELECT 문에서 INSERT INTO를 사용해요.

INSERT INTO tbl
    SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

또는 XLSX 형식 옵션과 함께 COPY 문을 사용해 Excel 파일을 기존 테이블에 가져올 수도 있어요.

COPY tbl FROM 'test_excel.xlsx' (FORMAT xlsx, SHEET 'Sheet1');

COPY 문으로 Excel 파일을 기존 테이블에 로드할 때는 대상 테이블의 컬럼 타입이 사용되어 Excel 시트의 셀 타입을 강제(coerce) 변환해요.

헤더 유무에 따른 시트 가져오기 (Importing a Sheet with/without a Header)

첫 행을 결과 컬럼의 이름으로 취급하려면 header 매개변수를 사용해요.

SELECT * FROM read_xlsx('test_excel.xlsx', header = true);

기본적으로, 첫 행의 모든 셀(추론되거나 제공된 범위 안에서)이 비어 있지 않은 문자열이면 첫 행을 헤더로 취급해요. 이 동작을 끄려면 headerfalse로 설정하세요.

타입 감지 (Detecting Types)

기존 테이블로 가져오는 것이 아닐 때, DuckDB는 Excel 시트의 컬럼 타입을 콘텐츠 및/또는 "number format"을 바탕으로 추론하려고 해요.

  • TIMESTAMP, TIME, DATE, BOOLEAN 타입은 셀에 적용된 "number format"을 바탕으로 가능할 때 추론돼요.
  • TRUEFALSE를 담은 텍스트 셀은 BOOLEAN으로 추론돼요.
  • 빈 셀은 기본적으로 DOUBLE 타입으로 간주돼요.
  • 그 외의 셀은 내용에 따라 VARCHAR 또는 DOUBLE로 추론돼요.

이 동작을 여러 가지 방법으로 조정할 수 있어요.

모든 빈 셀을 DOUBLE 대신 VARCHAR로 취급하려면 empty_as_varchartrue로 설정하세요.

SELECT * FROM read_xlsx('test_excel.xlsx', empty_as_varchar = true);

타입 추론을 완전히 끄고 모든 셀을 VARCHAR로 취급하려면 all_varchartrue로 설정하세요.

SELECT * FROM read_xlsx('test_excel.xlsx', all_varchar = true);

또한 ignore_errors 매개변수가 true로 설정되면, DuckDB는 해당 추론 컬럼 타입으로 캐스팅할 수 없는 셀을 조용히 NULL로 대체해요.

SELECT * FROM read_xlsx('test_excel.xlsx', ignore_errors = true);

함께 보기 (See Also)

DuckDB는 Excel 파일을 내보내는 것도 지원해요. Excel 지원에 대한 추가 세부 내용은 excel 확장 페이지를 참고하세요.

더 알아보기 (Learn more)