นำเข้า 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

ฉันไม่แน่ใจด้วยซ้ำว่าทำไมมันถึงพบสี่คอลัมน์ที่มีข้อมูลหกชิ้นและสองคอลัมน์


ดูเหมือนว่าคำสั่งจะคาดหวังส่วนหัวของคอลัมน์ในบรรทัดแรกและไม่รู้จัก line-terminator 6 - 2 = 4
mechanical_meat

ฉันสามารถระบุ line-terminator ได้ไหมหรือมีตัวใดตัวหนึ่งหายไปจาก csv ของฉัน
Molly Walters

1
ดูเหมือนว่าคุณสามารถระบุ line-terminator จากเครื่องมือบรรทัดคำสั่ง SQLite ได้ คุณมีโปรแกรมแก้ไขข้อความ (เช่น Notepad บน Windows แต่ดีกว่า) ที่จะแสดงอักขระสิ้นสุดบรรทัดหรือไม่? มีสามรูปแบบหลัก ๆ ได้แก่\r\nบน Windows \nบน * nix (รวมถึง Mac รุ่นใหม่ ๆ ) \rบน Mac รุ่นเก่า
mechanical_meat

ฉันใช้ BBEdit แต่ฉันไม่เห็นอักขระใด ๆ ที่ท้ายบรรทัด ฉันลองเพิ่มด้วยตนเอง แต่ดูเหมือนจะไม่ทำอะไรเลย ...
Molly Walters

1
เว็บไซต์นี้สามารถแปลงไฟล์ CSV (หรือ Excel) เป็น SQLite - converttosqlite.com
Code Slinger

คำตอบ:


154

สิ่งที่กล่าวในความคิดเห็น SQLite เห็นข้อมูลของคุณเป็น 1, 25, 62, 7 ฉันมีปัญหาด้วยเช่นกันและในกรณีของฉันแก้ไขได้โดยการเปลี่ยน "ตัวคั่น" เป็น ".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 ตีความคำพูดตามตัวอักษร - เอกสารเก่ากล่าว)
  • ป้อน sqlite shell ของ db ที่ต้องการเพิ่มข้อมูล

    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 shell ให้ป้อน:

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

หากคุณยังไม่ได้ติดตั้ง Sqlite บน Mac ของคุณให้เรียกใช้

$ brew install sqlite3

คุณอาจต้องค้นหาวิธีการติดตั้ง Homebrew ในเว็บ


1
วิธีจัดการการunescaped " characterแจ้งเตือน
TMOT ™

หากคุณสร้างตารางก่อนนำเข้าตารางนั้นจะไม่มองหาส่วนหัว
Rolf

ฉันต้องใส่ไฟล์ในโฟลเดอร์เดียวกับที่ sqlite3.exe ตั้งอยู่ ฉันสามารถใช้เส้นทางอื่นสำหรับไฟล์ csv ได้หรือไม่
Jaydeep Karena

จุดด้อย: "หากคุณยังไม่ได้ติดตั้ง Sqlite บน Mac ของคุณ" ... AFAIK จะถูกติดตั้งตามค่าเริ่มต้น
Laryx Decidua

8

ก่อนคำสั่ง. import พิมพ์ ".mode csv"


5
.mode ใช้สำหรับเอาต์พุตเท่านั้น
DeliriumTremens

9
เห็นได้ชัดว่าไม่เป็นเช่นนั้น จากส่วน. import doc: โปรดทราบว่าสิ่งสำคัญคือต้องตั้งค่า "mode" เป็น "csv" ก่อนรันคำสั่ง ".import" สิ่งนี้จำเป็นเพื่อป้องกันไม่ให้เชลล์บรรทัดคำสั่งพยายามตีความข้อความไฟล์อินพุตเป็นรูปแบบอื่น
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

ฉันมีปัญหาเดียวกันทุกประการ (บน OS X Maverics 10.9.1 พร้อม SQLite3 3.7.13 แต่ฉันไม่คิดว่า SQLite เกี่ยวข้องกับสาเหตุ) ฉันพยายามนำเข้าข้อมูล csv ที่บันทึกจาก MS Excel 2011 ซึ่ง btw ใช้';'เป็นตัวคั่นคอลัมน์ ฉันพบว่าไฟล์ csv จาก Excel ยังคงใช้อักขระขึ้นบรรทัดใหม่จาก Mac OS 9 ครั้งการเปลี่ยนเป็น unix newline ช่วยแก้ปัญหาได้ AFAIR BBEdit มีคำสั่งสำหรับสิ่งนี้เช่นเดียวกับ Sublime Text 2


2
ใช้งานง่ายกว่าtr -s '\r' '\n'และใช้ได้กับไฟล์สุ่มทุกประเภท
Donal Fellows


0

ตามที่บางเว็บไซต์และบทความอื่น ๆ ระบุไว้ดูง่ายๆสำหรับเว็บไซต์นี้ https://www.sqlitetutorial.net/sqlite-import-csv/

เราไม่จำเป็นต้องระบุตัวคั่นสำหรับcsvไฟล์เพราะ csv หมายถึงคั่นด้วยคอมมา sqlite> .separator ,ไม่จำเป็นต้องมีสายนี้

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

สิ่งนี้จะทำงานได้อย่างไม่มีที่ติ :)

PS: เมืองของฉันพร้อมส่วนหัว


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.