Excel 가져오기
Excel 가져오기 (Excel Import)
DuckDB는 Excel .xlsx 파일을 읽을 수 있어요. 단, .xls 파일은 지원되지 않는다는 점을 기억하세요. 이 페이지에서 시트 읽기, 특정 범위 읽기, 타입 감지까지 하나씩 살펴볼게요.
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);
기본적으로, 첫 행의 모든 셀(추론되거나 제공된 범위 안에서)이 비어 있지 않은 문자열이면 첫 행을 헤더로 취급해요. 이 동작을 끄려면 header를 false로 설정하세요.
타입 감지 (Detecting Types)
기존 테이블로 가져오는 것이 아닐 때, DuckDB는 Excel 시트의 컬럼 타입을 콘텐츠 및/또는 "number format"을 바탕으로 추론하려고 해요.
TIMESTAMP,TIME,DATE,BOOLEAN타입은 셀에 적용된 "number format"을 바탕으로 가능할 때 추론돼요.TRUE와FALSE를 담은 텍스트 셀은BOOLEAN으로 추론돼요.- 빈 셀은 기본적으로
DOUBLE타입으로 간주돼요. - 그 외의 셀은 내용에 따라
VARCHAR또는DOUBLE로 추론돼요.
이 동작을 여러 가지 방법으로 조정할 수 있어요.
모든 빈 셀을 DOUBLE 대신 VARCHAR로 취급하려면 empty_as_varchar를 true로 설정하세요.
SELECT * FROM read_xlsx('test_excel.xlsx', empty_as_varchar = true);
타입 추론을 완전히 끄고 모든 셀을 VARCHAR로 취급하려면 all_varchar를 true로 설정하세요.
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 확장 페이지를 참고하세요.