วิธีการนำเข้าโหลดไฟล์. 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

มีข้อผิดพลาด "ไม่สามารถเปิด db.sql" ได้เมื่อฉันใช้. read commond
Dory

2
จะได้รับชื่อคอลัมน์อย่างไรหากไม่มีอยู่ในไฟล์ csv
sumanth232

@ krishna222 ตามเอกสารหากไม่มีตารางบรรทัดแรกของ CSV จะถูกใช้เป็นชื่อคอลัมน์ ถ้ามีตารางอยู่แถวทั้งหมดจะถือว่าเป็นข้อมูล
alttag

26

ลองทำจากคำสั่งเช่น:

cat dump.sql | sqlite3 database.db

เห็นได้ชัดว่าสิ่งนี้จะใช้ได้เฉพาะกับคำสั่ง SQL ใน dump.sql ฉันไม่แน่ใจว่าจะนำเข้าไฟล์ CSV ได้อย่างไร


ฉันคิดว่ามันจะใช้งานได้เหมือนกัน แต่ผู้ใช้จะต้องตรวจสอบให้แน่ใจว่าได้ตั้งค่าการตั้งค่า sqlite3 สำหรับ.mode csv
FilBot3

แค่อยากแสดงความคิดเห็นที่นี่ตายจริง 100% sqlite3 database.db < dump.sqlคือ SOOOO SLOW !!! เลยใช้cat dump.sql | sqlite3 database.dbแทน! : D
Javier Buzzi

@JavierBuzzi: ขออภัย แต่นั่นไม่สมเหตุสมผล สองวิธีนี้เทียบเท่ากัน คุณต้องมีอย่างอื่นเกิดขึ้นเมื่อคุณลองใช้วิธีใดวิธีหนึ่ง ภายใต้เงื่อนไขการทดสอบที่มั่นคงฉันรับประกันว่าจะไม่มีความแตกต่างของความเร็ว
IcarusNM

22

ในการเปลี่ยนจาก SCRATCH ด้วย SQLite DB เพื่อนำเข้า 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ปีและผู้โพสต์ไม่ได้อยู่ที่นี่มานานกว่าสามปีแล้ว
Andrew Barber

คุณช่วยฉันหลายสัปดาห์ ฉันทำงานเสร็จใน 3 วินาที ฉันแปลงไฟล์ CSV 120MB เป็น. db ในเวลาเพียง 5 วินาที
zackygaurav

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: ข้อผิดพลาดที่คุณได้รับเกิดจากเครื่องหมายจุลภาคใน "เฮ้คุณ!" ในขณะที่โหลดบรรทัดที่ 2 Sqlite จะเห็น 3 คอลัมน์และในการลบคอมมาที่ 2 คุณสามารถโหลดได้โดยไม่มีข้อผิดพลาด
พระอิศวร

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

อืมฉันไม่เคยเห็นข้อผิดพลาดในการใช้สิ่งนี้ คุณใช้ข้อมูลที่ไม่ใช่ Unicode หรือไม่ใช่ utf8 หรือไม่ ในกรณีนี้คุณอาจต้องปรับแต่งสคริปต์เพื่อเปิดไฟล์ CSV โดยใช้การเข้ารหัสเฉพาะที่ใช้อยู่
Rufus Pollock

ในช่วงเวลาเดียวกันฉันเขียนบททับทิมที่ทำสิ่งเดียวกัน !! มันควรทำงานกับไฟล์ CSV หลายไฟล์พร้อมกันโดยเดาชื่อตารางจากชื่อไฟล์ github.com/dergachev/csv2sqlite
Dergachev

เราจำเป็นต้องอ่านจาก sys.stdin เนื่องจากเราต้องแปลงไฟล์ 60GB csv.gz หรือจะมีโอกาสได้รับ gzip read support ใน csv2sqlite หรือไม่? ขอบคุณ!
markusN

@markusN เปิดปัญหาบนตัวติดตาม github โดยทั่วไปฉันจะกังวลเกี่ยวกับไฟล์ 100GB + CSV ใน sqlite (คุณคิดว่า RDB "เหมาะสม" เช่น postgres หรือแม้แต่ bigquery, redshift เป็นต้น
Rufus Pollock


1

SQLite มีความยืดหยุ่นอย่างมากเนื่องจากยังอนุญาตให้ใช้คำสั่ง dotเฉพาะของ SQLite ในไวยากรณ์ของ SQL (แม้ว่าจะถูกตีความโดย 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

ในการทดสอบการนำเข้าไฟล์ CSV โดยใช้ไฟล์ SQL ให้รัน:

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

โดยสรุปหมายความว่าคุณสามารถใช้.importคำสั่งใน SQLite SQL ได้เช่นเดียวกับที่คุณสามารถทำได้ใน RDB อื่น ๆ เช่น MySQL 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 ใน "" และใช้ double slash \ ในพา ธ เพื่อให้แน่ใจว่า windows เข้าใจ


0

นี่คือวิธีที่คุณสามารถแทรกลงในคอลัมน์ข้อมูลประจำตัว:

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.