.sql 또는 .csv 파일을 SQLite로 가져 오는 방법은 무엇입니까?


115

.sql 또는 .csv 파일을 SQLite 에 덤프해야합니다 (SQLite3 API를 사용하고 있습니다). 전체 데이터베이스가 아닌 테이블 가져 오기 /로드에 대한 문서 만 찾았습니다. 지금 입력 할 때 :

sqlite3prompt> .import FILENAME TABLE 

전체 DB가 아닌 테이블을 예상하기 때문에 구문 오류가 발생합니다.


답변:


162

SQL 파일에서 가져 오려면 다음을 사용하십시오.

sqlite> .read <filename>

CSV 파일에서 가져 오려면 파일 유형과 대상 테이블을 지정해야합니다.

sqlite> .mode csv <table>
sqlite> .import <filename> <table>

2
이것은 정답이지만 때로는 펑키하거나 손상된 CSV 파일에 질식합니다.
Eli

.read commond를 사용할 때 "cannot open db.sql"오류가 발생합니다.
Dory 2014

2
csv 파일에없는 경우 열 이름을 어떻게 얻습니까?
sumanth232

@ krishna222, 문서 에 따라 테이블이 존재하지 않으면 CSV의 첫 번째 줄이 열 이름으로 사용됩니다. 테이블이 있으면 모든 행이 데이터로 처리됩니다.
alttag

26

다음과 같은 명령에서 시도하십시오.

cat dump.sql | sqlite3 database.db

이것은 분명히 dump.sql의 SQL 문에서만 작동합니다. CSV를 가져 오는 방법을 잘 모르겠습니다.


나는 이것이 똑같이 작동 할 것이라고 생각하지만, 사용자는 sqlite3 설정이 설정되어 있는지 확인해야합니다.mode csv
FilBot3

여기에 댓글을 달고 싶은데, 이것은 실제로 100 % 죽었습니다, sqlite3 database.db < dump.sqlSOOOO SLOW !!! 따라서 cat dump.sql | sqlite3 database.db대신 사용하십시오! : D
하비에르 Buzzi

@JavierBuzzi : 죄송하지만 말이되지 않습니다. 이 두 가지 방법은 동일합니다. 한 가지 방법을 시도했을 때 다른 일이 발생했을 것입니다. 안정적인 테스트 조건에서 속도 차이가 없음을 보증합니다.
IcarusNM

22

SQLite DB가있는 SCRATCH에서 CSV를 테이블로 가져 오는 방법 :

  • 웹 사이트에서 SQLite를 가져옵니다.
  • 명령 프롬프트에서 sqlite3 <your_db_file_name>* 빈 파일로 생성됩니다.
  • 새 데이터베이스에 새 테이블을 만듭니다. 가져 오려면 테이블이 CSV 필드와 일치해야합니다.
  • SQL 명령으로이를 수행합니다. CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

테이블이 생성되고 열이 파일의 데이터와 일치하면 위의 작업을 수행 할 수 있습니다.

.mode csv <table_name>
.import <filename> <table_name>

@jacob just fyi,이 답변은 거의 4 살이며 게시 한 사람은 3 년 이상 여기에 없었습니다.
앤드류 바버

당신은 내 주를 절약했습니다. 3 초 만에 작업을 마쳤습니다. 120MB CSV 파일을 단 5 초 만에 .db로 변환했습니다.
zackygaurav 20:49에

11

sqlite3 .import 명령은 인용 된 문자열에서도 쉼표를 구분 기호로 취급하기 때문에 일반 csv 데이터에는 작동하지 않습니다.

여기에는 셸에서 만든 csv 파일을 다시 가져 오는 것이 포함됩니다.

Create table T (F1 integer, F2 varchar);
Insert into T values (1, 'Hey!');
Insert into T values (2, 'Hey, You!');

.mode csv
.output test.csv
select * from T;

Contents of test.csv:
1,Hey!
2,"Hey, You!"

delete from T;

.import test.csv T
Error: test.csv line 2: expected 2 columns of data but found 3

csv를 Insert 문 목록으로 변환해야합니다. 그렇지 않으면 다른 구분 기호가 작동 할 것입니다.

SuperUser에서 LogParser를 사용하여 csv 파일을 처리하라는 제안을 보았습니다. 이에 대해 살펴 보겠습니다.


blairxy : 표시되는 오류는 "Hey, You!"의 쉼표 때문입니다. 두 번째 줄을로드하는 동안 Sqlite는 3 개의 열을보고 두 번째 쉼표를 제거하면 오류없이로드 할 수 있습니다.
Shiva

10

(python) 스크립트를 사용하는 것이 좋으면 이것을 자동화하는 python 스크립트가 있습니다 : https://github.com/rgrp/csv2sqlite

이렇게하면 테이블이 자동으로 생성 될뿐만 아니라 몇 가지 기본 유형 추측 및 데이터 캐스팅이 수행됩니다 (예 : 숫자가 무엇인지 알아 내고 열 유형을 "실제"로 설정합니다).


거의 작동합니다. 헤더 행을 가져옵니다. 그러나 나는 sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings# csv2sqlite.py {csv-file-path} {sqlite-db-path} [{table-name}]
Marcos

흠, 나는 이것을 사용하는 오류를 본 적이 없습니다. 유니 코드가 아닌 데이터 또는 UTF8이 아닌 데이터를 사용 했습니까? 그렇다면 사용중인 특정 인코딩을 사용하여 CSV 파일을 열도록 스크립트를 조정해야 할 수 있습니다.
Rufus Pollock 2013 년

같은시기에 같은 일을하는 루비 스크립트를 작성했습니다 !! 파일 이름에서 테이블 이름을 추측하여 한 번에 여러 CSV 파일에서 작동해야합니다. github.com/dergachev/csv2sqlite
Dergachev

60GB csv.gz 파일을 변환해야하므로 sys.stdin에서 읽어야합니다. 또는 csv2sqlite에 gzip 읽기 지원을받을 수있는 기회가 있습니까? 감사!
markusN 2014

@markusN은 github 추적기에서 문제를 엽니 다. 일반적으로, 내가 sqlite가에서 100GB의 + CSV 파일에 대해 걱정할 것 (당신이 생각 적색 편이 등은 "적절한"RDB 예를 들어 포스트 그레스 또는 BigQuery에 대한
루퍼스 폴록


1

SQLite는 SQL 구문에서 SQLite 특정 도트 명령 을 허용하기 때문에 매우 유연 합니다 (CLI로 해석 됨). 이는 이와 같은 작업을 수행 할 수 있음을 의미합니다.

다음 sms과 같은 테이블을 만듭니다 .

# sqlite3 mycool.db '.schema sms'
CREATE TABLE sms (_id integer primary key autoincrement, Address VARCHAR, Display VARCHAR, Class VARCHAR, ServiceCtr VARCHAR, Message VARCHAR, Timestamp TIMESTAMP NOT NULL DEFAULT current_timestamp);

그런 다음 두 파일 :

# echo "1,ADREZZ,DizzPlay,CLAZZ,SMSC,DaTestMessage,2015-01-24 21:00:00">test.csv

# cat test.sql
.mode csv
.header on
.import test.csv sms

SQL 파일을 사용하여 CSV 파일 가져 오기를 테스트하려면 다음을 실행하십시오.

# sqlite3 -csv -header mycool.db '.read test.sql'

결론적으로 이것은 .importMySQL과 같은 다른 RDB에서 할 수있는 것처럼 SQLite SQL 에서 문을 사용할 수 있음을 의미합니다 LOAD DATA INFILE. 그러나 이것은 권장되지 않습니다.


1

termsql을 확인하십시오. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

명령 줄에서 텍스트를 SQL로 변환합니다. (CSV는 텍스트 일뿐)

예:

cat textfile | termsql -o sqlite.db

기본적으로 구분 기호는 공백이므로 쉼표를 사용하는 CSV에서 작동하도록하려면 다음과 같이하면됩니다.

cat textfile | termsql -d ',' -o sqlite.db

또는 다음을 수행 할 수 있습니다.

termsql -i textfile -d ',' -o sqlite.db

기본적으로 열 이름에 대해 첫 번째 행을 사용하려면 "COL0", "COL1"열 이름을 생성합니다.

termsql -i textfile -d ',' -1 -o sqlite.db

사용자 정의 열 이름을 설정하려면 다음을 수행하십시오.

termsql -i textfile -d ',' -c 'id,name,age,color' -o sqlite.db

1

Windows에서 사용하는 경우 ""에서 db에 경로를 추가하고 경로에 이중 슬래시 \를 사용하여 Windows에서이를 이해하는지 확인하십시오.


0

다음은 ID 열에 삽입하는 방법입니다.

CREATE TABLE my_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name COLLATE NOCASE);
CREATE TABLE temp_table (name COLLATE NOCASE);

.import predefined/myfile.txt temp_table 
insert into my_table (name) select name from temp_table;

myfile.txt는 C : \ code \ db \ predefined \에있는 파일입니다.

data.db는 C : \ code \ db \에 있습니다.

myfile.txt는 개행 문자로 구분 된 문자열을 포함합니다.

더 많은 열을 추가하려는 경우 기본값 인 파이프 문자를 사용하여 열을 분리하는 것이 더 쉽습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.