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.