CSV 가상 테이블

CSV 가상 테이블

CSV 가상 테이블은 RFC 4180 형식의 콤마로 구분된 값을 읽어서, 마치 SQL 테이블의 행과 열인 것처럼 반환해줘요. 대량의 CSV 콘텐츠를 벌크 로드해야 하는 애플리케이션에 특히 유용하답니다.

출처: 문서

본문

CSV 가상 테이블은 RFC 4180 형식의 콤마로 구분된 값을 읽고, 그 콘텐츠를 마치 SQL 테이블의 행과 열인 것처럼 반환해요.

CSV 가상 테이블은 대량의 콤마로 구분된 값 콘텐츠를 벌크 로드해야 하는 애플리케이션에 유용해요. 또한 다른 가상 테이블을 구현하기 위한 템플릿 소스 파일로도 유용하죠.

CSV 가상 테이블은 SQLite amalgamation에 내장되어 있지 않아요. 로더블 확장으로 컴파일할 수 있는 별도의 소스 파일로 제공됩니다. 명령줄 쉘에서 CSV 가상 테이블을 전형적으로 사용하는 방법은 다음과 같아요:

.load ./csv
CREATE VIRTUAL TABLE temp.t1 USING csv(filename='thefile.csv');
SELECT * FROM t1;

위 스크립트의 첫 번째 줄은 명령줄 쉘이 CSV용 런타임 로더블 확장을 읽고 활성화하게 해요. 애플리케이션에서는 이에 해당하는 C언어 API가 sqlite3_load_extension()이에요. 확장 파일명에서 파일 확장자(예: ".dll" 또는 ".so" 또는 ".dylib")를 생략했다는 점에 주목해요. 확장자를 생략하는 건 필수는 아니지만 스크립트를 크로스 플랫폼으로 만드는 데 도움을 줘요. SQLite가 자동으로 적절한 확장자를 붙여주거든요.

두 번째 줄은 인자에 있는 파일의 콘텐츠를 읽는 "t1"이라는 가상 테이블을 만들어요. 컬럼의 수와 이름은 첫 번째 줄의 콘텐츠를 읽어 자동으로 결정돼요. CSV 가상 테이블의 다른 옵션들은 CSV 콘텐츠를 별도 파일 대신 문자열에서 가져오는 기능과, 컬럼 수와 이름을 프로그래머가 더 잘 제어할 수 있게 해줘요. 옵션들에 대한 자세한 내용은 아래에서 다룰게요. CSV 가상 테이블은 보통 TEMP 테이블로 만들어서, 현재 데이터베이스 연결 동안에만 존재하고 데이터베이스 스키마의 영구적인 부분이 되지 않게 해요. SQLite에는 "CREATE TEMP VIRTUAL TABLE" 명령이 없다는 점에 주의해요. 대신 가상 테이블 이름 앞에 "temp." 스키마 접두사를 붙이면 돼요.

예제의 세 번째 줄은 CSV 파일의 모든 콘텐츠를 읽기 위해 가상 테이블을 사용하는 모습이에요. 이건 가상 테이블의 가장 단순한 사용법이죠. CSV 가상 테이블은 일반 가상 테이블을 사용할 수 있는 어디든 사용할 수 있어요. 서브쿼리나 common table expression 안에서도 사용할 수 있고, 필요에 따라 WHERE, GROUP BY, HAVING, ORDER BY, LIMIT 절도 추가할 수 있어요.

2. 인자

위 예제에서는 CSV 가상 테이블에 filename='thefile.csv'라는 단일 인자를 보여줬지만, 다른 인자도 가능해요.

  • filename=FILENAME — filename= 인자는 CSV 콘텐츠를 읽을 외부 파일을 지정해요. 모든 CSV 가상 테이블은 filename= 인자나 data= 인자 중 하나만 가져야 하고 둘 다 가질 수는 없어요.

  • data=TEXT — data= 인자는 TEXT가 CSV 파일의 리터럴 콘텐츠임을 지정해요.

  • schema=SCHEMA — schema= 인자는 CSV 가상 테이블이 sqlite3_declare_vtab() 인터페이스에 전달해서 가상 테이블의 컬럼 이름을 정의하는 CREATE TABLE 문을 지정해요.

  • columns=N — columns=N 인자는 CSV 파일의 컬럼 수를 지정해요. 입력 데이터에 이보다 많은 컬럼이 있으면 초과 컬럼은 무시돼요. 입력 데이터에 컬럼이 더 적으면 추가 컬럼은 NULL로 채워져요. columns=N 인자를 생략하면 CSV 파일의 첫 줄을 읽어 컬럼 수를 결정해요.

  • header=BOOLEAN 또는 그냥 header — header 인자가 true이면 CSV 파일의 첫 행을 데이터가 아니라 헤더로 취급해요. CSV 파일의 두 번째 줄이 콘텐츠의 첫 행이 되죠. schema= 옵션을 생략하면 CSV 파일의 첫 줄이 컬럼 이름을 결정해요.

3. 컬럼 이름

가상 테이블의 컬럼 이름은 주로 schema= 인자로 결정돼요. schema= 인자를 생략했는데 header가 true이면 CSV 파일 첫 줄에서 찾은 값들이 컬럼 이름이 돼요. schema= 인자를 생략하고 header가 false이면 컬럼 이름은 "c0", "c1", "c2" 등으로 붙어요.

더 알아보기 (Learn more)