Importuj CSV do SQLite


117

Próbuję zaimportować plik CSV do tabeli SQLite.

Przykład CSV:

1,2
5,6
2,7

Przykładowe polecenie:

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

Nie jestem nawet pewien, dlaczego znalazłby cztery kolumny z sześcioma danymi i dwiema kolumnami.


Wygląda na to, że polecenie oczekuje nagłówków kolumn w pierwszym wierszu i że terminator wiersza nie jest rozpoznawany jako taki. 6 - 2 = 4
Mechanical_meat

Czy mogę określić terminator linii, czy też brakuje go w moim pliku csv?
Molly Walters,

1
Nie wygląda na to, abyś mógł określić terminator linii z narzędzia wiersza poleceń SQLite. Czy masz edytor tekstu (taki jak Notatnik w systemie Windows, ale lepszy), który pokaże znaki końca linii? Istnieją trzy główne odmiany: \r\nw systemie Windows, \nna * nix (obejmuje nowsze komputery Mac), \rna starszych komputerach Mac.
Mechanical_meat

Używam BBEdit, ale nie widzę żadnego z tych znaków na końcu linii. Próbowałem dodać je ręcznie, ale wydaje się, że nic to nie daje ...
Molly Walters,

1
Ta strona internetowa może konwertować plik CSV (lub Excel) do SQLite - converttosqlite.com
Code Slinger

Odpowiedzi:


154

Co również jest powiedziane w komentarzach, SQLite widzi twoje dane wejściowe jako 1, 25, 62, 7. Miałem również problem, który w moim przypadku został rozwiązany przez zmianę "separatora" na ".mode csv". Możesz więc spróbować:

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

Pierwsze polecenie tworzy nazwy kolumn dla tabeli. Jeśli jednak chcesz, aby nazwy kolumn były dziedziczone z pliku csv, możesz po prostu zignorować pierwszą linię.


83
W przypadku innych osób, które wylądują tutaj z wyszukiwania, jeśli pierwszy wiersz twojego pliku csv zawiera nazwy kolumn, możesz pominąć pierwsze create tablepolecenie, a sqlite użyje nazw kolumn z pliku csv.
EarlCrapstone

2
@EarlCrapstone: czy mógłbyś to rozwinąć? Wydaje mi się, że to nie działa.
d33tah,

3
@ d33tah Spójrz na te przykłady . Zwróć uwagę, że pierwsza linia zawiera nazwy kolumn, Year,Make,Model,Description,Pricea nie rzeczywiste dane. Jeśli tak jest w przypadku pliku CSV, nie musisz ręcznie tworzyć tabeli za pomocą create tablepolecenia. .importPolecenie użyje pierwszy wiersz w pliku do określenia nazwy kolumn i utworzyć tabelę odpowiednio. Nadal musisz dołączyć nazwę tabeli do polecenia. Te same informacje z dokumentacji SQLite .
EarlCrapstone,

Dlaczego siedzisz .mode? Czy to nie tylko do wyjścia?
Alan

Jeśli okaże się, że wygenerowana tabela grupuje wiele kolumn, sprawdź, czy nie używasz zastrzeżonego słowa, takiego jak typenazwa kolumny CSV.
paulvs

29

Oto jak to zrobiłem.

  • Utwórz / przekonwertuj plik csv, aby był oddzielony tabulatorami (\ t) ORAZ nie ujęty w żadne cudzysłowy (sqlite interpretuje cudzysłowy dosłownie - mówi stare dokumenty)
  • Wprowadź powłokę sqlite bazy danych, do której mają zostać dodane dane

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


dla wielu wierszy moje tsv musiało określić separator WIERSZ za pomocą tego polecenia .separator "\t" "\r"
mfink

1
Podczas dyskusji na temat formatów plików, tsv! = Csv
Alan.

24

Łączę tutaj informacje z poprzednich odpowiedzi z własnym doświadczeniem. Najłatwiej jest dodać oddzielone przecinkami nagłówki tabeli bezpośrednio do pliku csv, po którym następuje nowy wiersz, a następnie wszystkie dane csv.

Jeśli nigdy więcej nie będziesz robić rzeczy sqlite (tak jak ja), może to zaoszczędzić ci wyszukiwania w sieci lub dwóch:

W powłoce Sqlite wprowadź:

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

Jeśli nie masz zainstalowanego Sqlite na komputerze Mac, uruchom

$ brew install sqlite3

Być może trzeba będzie przeprowadzić jedno wyszukiwanie w Internecie, aby dowiedzieć się, jak zainstalować Homebrew.


1
Jak radzić sobie z unescaped " characteralertami?
TMOTTM

Jeśli utworzysz tabelę przed importem, nie będzie ona szukać nagłówków.
Rolf

Muszę umieścić plik w tym samym folderze, w którym znajduje się sqlite3.exe. Czy mogę użyć innej ścieżki do pliku CSV?
Jaydeep Karena

Drobna uwaga: „Jeśli nie masz zainstalowanego Sqlite na swoim Macu” ... AFAIK jest instalowany domyślnie.
Laryx Decidua

8

przed poleceniem .import wpisz „.mode csv”


5
.mode służy tylko do wyświetlania
DeliriumTremens

9
Najwyraźniej nie. Z sekcji .import doc: Zauważ, że ważne jest, aby ustawić „mode” na „csv” przed uruchomieniem polecenia „.import”. Jest to konieczne, aby powłoka wiersza poleceń nie próbowała interpretować tekstu pliku wejściowego jako innego formatu.
Richard - Rogue Wave Limited

8

Jak zaimportować plik CSV do sqlite3

  1. Utwórz bazę danych

    sqlite3 NYC.db
  2. Ustaw tryb i nazwę tabeli

    .mode csv tripdata
  3. Zaimportuj dane pliku CSV do sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Znajdź tabele

    .tables
  5. Znajdź schemat tabeli

    .schema tripdata
  6. Znajdź dane tabeli

    select * from tripdata limit 10;
  7. Policz liczbę wierszy w tabeli

    select count (*) from tripdata;

4

Z Termsql możesz to zrobić w jednej linii:

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


link został uszkodzony, zmieniono go na repozytorium github - proszę wyjaśnić!
Andreas Niedermair

3

Miałem dokładnie ten sam problem (na OS X Maverics 10.9.1 z SQLite3 3.7.13, ale nie sądzę, że SQLite ma związek z przyczyną). Próbowałem zaimportować dane csv zapisane z MS Excel 2011, co przy okazji. używa ';'jako separatora kolumn. Dowiedziałem się, że plik csv z Excela nadal 9 razy używa znaku nowej linii z Mac OS, zmiana go na unix nowa linia rozwiązała problem. AFAIR BBEdit ma do tego polecenie, a także Sublime Text 2.


2
Jest łatwiejszy w użyciu tr -s '\r' '\n'i będzie działać z wszelkiego rodzaju losowymi plikami.
Donal Fellows

1

Wykonaj kroki:-

  1. 1] sqlite3 nazwa 2] .mode csv nazwa tabeli 3] .import Nazwa pliku.csv nazwa tabeli

0

Jak podają niektóre strony internetowe i inne artykuły, wystarczy spojrzeć na ten. https://www.sqlitetutorial.net/sqlite-import-csv/

Nie musimy określać separatora csvpliku, ponieważ csv oznacza oddzielenie przecinkami. sqlite> .separator ,nie ma potrzeby tej linii.

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

To zadziała bez zarzutu :)

PS: Moje miasta.csv z nagłówkiem.


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

2
Nie zapomnij .save someFileNamew końcu biec . Znalezienie tego zajęło mi godzinę, aby ostatecznie wyeksportować to w pliku bazy danych pamięci na dysk 😅
ioopl
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.