Nhập CSV vào SQLite


117

Tôi đang cố nhập tệp csv vào bảng SQLite.

Ví dụ về csv:

1,2
5,6
2,7

Lệnh ví dụ:

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

Tôi thậm chí không chắc tại sao nó sẽ tìm thấy bốn cột với sáu phần dữ liệu và hai cột.


Có vẻ như lệnh yêu cầu tiêu đề cột ở dòng đầu tiên và dấu chấm dứt dòng không được nhận dạng như vậy. 6 - 2 = 4
Mechanical_meat,

Tôi có thể chỉ định dấu kết thúc dòng hay còn thiếu một dấu trong csv của mình không?
Molly Walters

1
Có vẻ như bạn không thể chỉ định dấu chấm dứt dòng từ công cụ dòng lệnh SQLite. Bạn có trình soạn thảo văn bản (giống như Notepad trên Windows, nhưng tốt hơn) sẽ hiển thị cho bạn các ký tự kết thúc dòng không? Có ba biến thể chính: \r\ntrên Windows, \ntrên * nix (bao gồm cả các máy Mac mới hơn), \rtrên các máy Mac cũ hơn.
Mechanical_meat,

Tôi đang sử dụng BBEdit, nhưng tôi không thấy bất kỳ ký tự nào trong số đó ở cuối dòng. Tôi đã cố gắng bổ sung chúng bằng tay, nhưng nó dường như không làm bất cứ điều gì ...
Molly Walters

1
Trang web này có thể chuyển đổi một CSV (hoặc Excel) tập tin vào SQLite - converttosqlite.com
Mã Slinger

Câu trả lời:


153

Điều cũng đang được nói trong các nhận xét, SQLite xem đầu vào của bạn là 1, 25, 62, 7. Tôi cũng gặp sự cố và trong trường hợp của tôi, nó đã được giải quyết bằng cách thay đổi "dấu phân tách" thành ".mode csv". Vì vậy, bạn có thể thử:

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

Lệnh đầu tiên tạo tên cột cho bảng. Tuy nhiên, nếu bạn muốn các tên cột được kế thừa từ tệp csv, bạn có thể chỉ cần bỏ qua dòng đầu tiên.


83
Đối với những người khác đến đây từ tìm kiếm, nếu dòng đầu tiên của tệp csv của bạn chứa tên cột, thì bạn có thể bỏ qua create tablelệnh đầu tiên và sqlite sẽ sử dụng tên cột từ tệp csv.
EarlCrapstone

2
@EarlCrapstone: bạn có thể nói rõ hơn không? Nó dường như không hiệu quả với tôi.
d33tah

3
@ d33tah Hãy xem những ví dụ này . Lưu ý cách dòng đầu tiên chứa tên cột Year,Make,Model,Description,Pricechứ không phải dữ liệu thực tế. Nếu đó là trường hợp với tệp CSV của bạn, thì bạn không cần phải tạo bảng theo cách thủ công bằng create tablelệnh. Các .importlệnh sẽ sử dụng dòng đầu tiên trong tập tin của bạn để xác định tên cột và tạo bảng cho phù hợp. Bạn vẫn phải bao gồm tên của bảng trong lệnh. Thông tin tương tự từ tài liệu SQLite .
EarlCrapstone

Tại sao bạn cài đặt .mode? Đó không phải là chỉ cho đầu ra?
Alan

Nếu bạn thấy rằng bảng được tạo nhóm nhiều cột với nhau, hãy kiểm tra để đảm bảo rằng bạn không sử dụng từ dành riêng, chẳng hạn như typecho tên cột CSV.
paulvs

29

Đây là cách tôi đã làm điều đó.

  • Tạo / Chuyển đổi tệp csv để được phân tách bởi các tab (\ t) VÀ không được bao gồm bởi bất kỳ dấu ngoặc kép nào (sqlite diễn giải các dấu ngoặc kép theo nghĩa đen - tài liệu cũ nói)
  • Nhập shell sqlite của db mà dữ liệu cần được thêm vào

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


đối với nhiều hàng, tsv của tôi cần chỉ định dấu phân tách ROW bằng lệnh này .separator "\t" "\r"
mfink

1
Khi thảo luận về các định dạng tệp, tsv! = Csv
Alan

24

Tôi đang kết hợp thông tin từ các câu trả lời trước đây với kinh nghiệm của riêng tôi. Cách dễ nhất là thêm trực tiếp các tiêu đề bảng được phân tách bằng dấu phẩy vào tệp csv của bạn, sau đó là một dòng mới và sau đó là tất cả dữ liệu csv của bạn.

Nếu bạn không bao giờ làm lại nội dung sqlite (như tôi), điều này có thể giúp bạn tiết kiệm một hoặc hai tìm kiếm trên web:

Trong Sqlite shell, nhập:

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

Nếu bạn chưa cài đặt Sqlite trên máy Mac, hãy chạy

$ brew install sqlite3

Bạn có thể cần thực hiện một tìm kiếm trên web để biết cách cài đặt Homebrew.


1
Làm thế nào để xử lý unescaped " charactercảnh báo?
TMOTTM

Nếu bạn tạo một bảng trước khi nhập, thì bảng đó sẽ không tìm kiếm các tiêu đề.
Rolf

Tôi phải đặt tệp trong cùng một thư mục có sqlite3.exe. Tôi có thể sử dụng đường dẫn khác cho tệp csv không?
Jaydeep Karena

Điểm nhỏ: "Nếu bạn chưa cài đặt Sqlite trên máy Mac" ... AFAIK, nó được cài đặt theo mặc định.
Laryx Decidua

8

trước lệnh .import, hãy nhập ".mode csv"


5
.mode là cho sản lượng chỉ
DeliriumTremens

9
Rõ ràng không phải như vậy. Từ phần .import doc: Lưu ý rằng điều quan trọng là phải đặt "mode" thành "csv" trước khi chạy lệnh ".import". Điều này là cần thiết để ngăn trình bao dòng lệnh cố gắng diễn giải văn bản tệp đầu vào dưới dạng một số định dạng khác.
Richard - Rogue Wave Limited

8

Cách nhập tệp csv vào sqlite3

  1. Tạo nên cơ sở dữ liệu

    sqlite3 NYC.db
  2. Đặt chế độ và tên bảng

    .mode csv tripdata
  3. Nhập dữ liệu tệp csv vào sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Tìm bảng

    .tables
  5. Tìm giản đồ bảng của bạn

    .schema tripdata
  6. Tìm dữ liệu bảng

    select * from tripdata limit 10;
  7. Đếm số hàng trong bảng

    select count (*) from tripdata;


3

Tôi đã gặp chính xác vấn đề tương tự (trên OS X Maverics 10.9.1 với SQLite3 3.7.13, nhưng tôi không nghĩ rằng SQLite có liên quan đến nguyên nhân). Tôi đã cố gắng nhập dữ liệu csv được lưu từ MS Excel 2011, btw. sử dụng ';'làm dấu phân tách cột. Tôi phát hiện ra rằng tệp csv từ Excel vẫn sử dụng ký tự dòng mới từ Mac OS 9 lần, việc thay đổi nó thành dòng mới unix đã giải quyết được vấn đề. AFAIR BBEdit có một lệnh cho việc này, cũng như Sublime Text 2.


2
Nó dễ sử dụng hơn tr -s '\r' '\n'và điều đó sẽ hoạt động với tất cả các loại tệp ngẫu nhiên.
Donal Fellows

1

Làm theo các bước: -

  1. 1] sqlite3 name 2] .mode csv tablename 3] .import Filename.csv tablename

0

Như một số trang web và bài báo khác chỉ rõ, đơn giản của nó có cái nhìn về cái này. https://www.sqlitetutorial.net/sqlite-import-csv/

Chúng tôi không cần chỉ định dấu phân tách cho csvtệp, becayse csv có nghĩa là được phân tách bằng dấu phẩy. sqlite> .separator ,không cần dòng này.

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

Điều này sẽ hoạt động hoàn hảo :)

Tái bút: Thành phố của tôi.csv với tiêu đề.


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

2
Đừng quên chạy .save someFileNamecuối cùng. Tôi mất nhiều giờ để tìm cái này để cuối cùng xuất cái này trong tệp cơ sở dữ liệu bộ nhớ vào đĩa 😅
ioopl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.