CSV를 SQLite로 가져 오기


117

csv 파일을 SQLite 테이블로 가져 오려고합니다.

csv 예 :

1,2
5,6
2,7

예제 명령 :

sqlite> create table foo(a, b);
sqlite> .separator ,
sqlite> .import test.csv foo
Error: test.csv line 1: expected 2 columns of data but found 4

6 개의 데이터와 2 개의 열이있는 4 개의 열을 찾는 이유도 모르겠습니다.


명령이 첫 번째 줄에 열 머리글을 예상하고 줄 종결자가 인식되지 않는 것으로 보입니다. 6 - 2 = 4
Mechanical_meat

줄 종결자를 지정할 수 있습니까? 아니면 내 CSV에서 누락 된 것이 있습니까?
Molly Walters

1
SQLite 명령 줄 도구에서 줄 종결자를 지정할 수없는 것 같습니다. 줄 끝 문자를 표시하는 텍스트 편집기 (Windows의 메모장과 같지만 더 좋음)가 있습니까? 세 가지 주요 변형이 있습니다 : \r\nWindows, \n* nix (최신 Mac 포함), \r구형 Mac.
mechanical_meat

BBEdit를 사용하고 있지만 줄 끝에 해당 문자가 표시되지 않습니다. ... 나는 수동으로 추가하는 시도,하지만 아무것도하지 않는 것
몰리 월터스를

1
-이 웹 사이트는 SQLite는에 CSV (또는 Excel) 파일을 변환 할 수 있습니다 converttosqlite.com
코드 웨이터

답변:


153

주석에서도 언급 된 내용은 SQLite는 귀하의 입력을 1, 25, 62, 7로 간주합니다. 나도에서 문제가 발생했으며 제 경우에는 "separator"를 ".mode csv"로 변경하여 해결했습니다. 따라서 시도해 볼 수 있습니다.

sqlite> create table foo(a, b);
sqlite> .mode csv
sqlite> .import test.csv foo

첫 번째 명령은 테이블의 열 이름을 만듭니다. 그러나 csv 파일에서 상속 된 열 이름을 원하는 경우 첫 번째 줄을 무시할 수 있습니다.


83
검색을 통해 여기에 도착한 다른 사람들의 경우 csv 파일의 첫 번째 줄에 열 이름이 포함되어 있으면 첫 번째 create table명령을 생략 할 수 있으며 sqlite는 csv 파일의 열 이름을 사용합니다.
EarlCrapstone

2
@EarlCrapstone : 자세히 설명해 주시겠습니까? 나를 위해 작동하지 않는 것 같습니다.
d33tah

3
@ d33tah이 예제를보십시오 . 첫 번째 줄에는 Year,Make,Model,Description,Price실제 데이터가 아닌 열 이름이 포함되어 있습니다 . CSV 파일에 해당하는 경우 create table명령을 사용하여 테이블을 수동으로 만들 필요가 없습니다 . 이 .import명령은 파일의 첫 번째 줄을 사용하여 열 이름을 결정하고 그에 따라 테이블을 만듭니다. 여전히 명령에 테이블 이름 을 포함해야합니다 . SQLite 문서 의 동일한 정보 .
EarlCrapstone

왜 설정하고 .mode있습니까? 그것은 출력만을위한 것이 아닙니까?
Alan

생성 된 테이블이 여러 열을 함께 그룹화 type하는 경우 CSV 열 이름 과 같은 예약어를 사용하고 있지 않은지 확인하십시오 .
paulvs

29

내가 한 방법은 다음과 같습니다.

  • csv 파일을 탭 (\ t)으로 구분하고 따옴표로 묶지 않도록 만들기 / 변환합니다 (sqlite는 따옴표를 문자 그대로 해석-이전 문서를 말합니다)
  • 데이터를 추가해야하는 db의 sqlite 쉘을 입력하십시오.

    sqlite> .separator "\t" ---IMPORTANT! should be in double quotes sqlite> .import afile.csv tablename-to-import-to


여러 행의 경우 내 tsv는이 명령으로 ROW 구분 기호를 지정해야했습니다 .separator "\t" "\r"
mfink

1
파일 형식에 대해 논의 할 때 tsv! = csv tools.ietf.org/html/rfc4180
Alan

24

여기에 이전 답변의 정보를 내 경험과 병합하고 있습니다. 가장 쉬운 방법은 쉼표로 구분 된 표 헤더를 csv 파일에 직접 추가 한 다음 새 줄을 추가 한 다음 모든 csv 데이터를 추가하는 것입니다.

(나와 같은) sqlite 작업을 다시하지 않으면 웹 검색을 한두 번 절약 할 수 있습니다.

Sqlite 셸에서 다음을 입력합니다.

$ sqlite3 yourfile.sqlite
sqlite>  .mode csv
sqlite>  .import test.csv yourtable
sqlite>  .exit

Mac에 Sqlite가 설치되어 있지 않은 경우 다음을 실행하십시오.

$ brew install sqlite3

Homebrew를 설치하는 방법에 대해 웹 검색을 한 번 수행해야 할 수도 있습니다.


1
unescaped " character경고 를 처리하는 방법은 무엇입니까?
TMOTTM

가져 오기 전에 테이블을 생성하면 헤더를 찾지 않습니다.
Rolf

sqlite3.exe가있는 폴더에 파일을 넣어야합니다. csv 파일에 다른 경로를 사용할 수 있습니까?
Jaydeep Karena 19

사소한 점 : "Mac에 Sqlite를 설치하지 않은 경우"... AFAIK는 기본적으로 설치됩니다.
Laryx Decidua

8

.import 명령 앞에 ".mode csv"를 입력합니다.


5
.mode는 출력 전용입니다
DeliriumTremens 2015

9
분명히 그렇지 않습니다. .import doc 섹션에서 : ".import"명령을 실행하기 전에 "mode"를 "csv"로 설정하는 것이 중요합니다. 이는 명령 줄 셸이 입력 파일 텍스트를 다른 형식으로 해석하지 못하도록하기 위해 필요합니다.
Richard-Rogue Wave Limited

8

csv 파일을 sqlite3로 가져 오는 방법

  1. 데이터베이스 생성

    sqlite3 NYC.db
  2. 모드 및 테이블 이름 설정

    .mode csv tripdata
  3. csv 파일 데이터를 sqlite3로 가져 오기

    .import yellow_tripdata_2017-01.csv tripdata
  4. 테이블 찾기

    .tables
  5. 테이블 스키마 찾기

    .schema tripdata
  6. 테이블 데이터 찾기

    select * from tripdata limit 10;
  7. 테이블의 행 수를 계산

    select count (*) from tripdata;

4

Termsql 을 사용하면 한 줄로 수행 할 수 있습니다.

termsql -i mycsvfile.CSV -d ',' -c 'a,b' -t 'foo' -o mynewdatabase.db


링크가 깨져서 github repo로 변경되었습니다.
Andreas Niedermair

3

나는 똑같은 문제가있었습니다 (SQLite3 3.7.13이있는 OS X Maverics 10.9.1에서 SQLite가 원인과 관련이 있다고 생각하지 않습니다). MS Excel 2011에서 저장된 csv 데이터를 가져 오려고했습니다. ';'열 구분자로 사용합니다 . Excel의 csv 파일이 여전히 Mac OS의 개행 문자를 9 번 사용한다는 것을 알게되었고,이를 유닉스 개행으로 변경하면 문제가 해결되었습니다. AFAIR BBEdit에는 Sublime Text 2뿐만 아니라 이에 대한 명령이 있습니다.


2
사용하기가 더 쉽고 tr -s '\r' '\n'모든 종류의 무작위 파일에서 작동합니다.
Donal Fellows

1

다음 단계를 따르십시오.

  1. 1] sqlite3 이름 2] .mode csv tablename 3] .import Filename.csv tablename

0

일부 웹 사이트 및 기타 기사에서 지정했듯이 간단하게 살펴볼 수 있습니다. https://www.sqlitetutorial.net/sqlite-import-csv/

csvcsv는 쉼표로 구분 된 것을 의미 하므로 파일 구분 기호를 지정할 필요가 없습니다 . sqlite> .separator ,이 라인이 필요 없습니다.

sqlite> create table cities(name, population);
sqlite> .mode csv
sqlite> .import c:/sqlite/city_no_header.csv cities

이것은 완벽하게 작동합니다 :)

추신 : 헤더가있는 내 도시 .csv.


name,population
Abilene,115930
Akron,217074
Albany,93994
Albuquerque,448607
Alexandria,128283
Allentown,106632
Amarillo,173627
Anaheim,328014

2
.save someFileName결국 실행하는 것을 잊지 마십시오 . 마침내 이것을 메모리 데이터베이스 파일에서 디스크로 내보내는 데 시간이 걸렸습니다 😅
ioopl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.