Mam nienormalizowany dziennik zdarzeń CSV od klienta, który próbuję załadować do tabeli MySQL, abym mógł przefakturować go do rozsądnego formatu. Utworzyłem tabelę o nazwie „CSVImport”, która ma jedno pole dla każdej kolumny pliku CSV. Plik CSV zawiera 99 kolumn, więc samo w sobie było to dość trudne zadanie:
CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);
Tabela nie zawiera żadnych ograniczeń, a wszystkie pola zawierają wartości VARCHAR (256), z wyjątkiem kolumn zawierających liczby (reprezentowane przez INT), tak / nie (reprezentowane przez BIT), ceny (reprezentowane przez DECIMAL) i blurb tekstowy ( reprezentowany przez TEKST).
Próbowałem załadować dane do pliku:
LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023 Deleted: 0 Skipped: 0 Warnings: 198256
SELECT * FROM CSVImport;
| NULL | NULL | NULL | NULL | NULL |
...
Cały stół jest wypełniony NULL
.
Myślę, że problem polega na tym, że blobty tekstowe zawierają więcej niż jedną linię, a MySQL analizuje plik tak, jakby każda nowa linia odpowiadała jednemu wierszowi bazy danych. Mogę bez problemu załadować plik do OpenOffice.
Plik clientdata.csv zawiera 2593 wierszy i 570 rekordów. Pierwszy wiersz zawiera nazwy kolumn. Myślę, że jest rozdzielany przecinkami, a tekst jest najwyraźniej rozdzielany podwójnym cudzysłowem.
AKTUALIZACJA:
W razie wątpliwości przeczytaj instrukcję: http://dev.mysql.com/doc/refman/5.0/en/load-data.html
Dodałem trochę informacji do LOAD DATA
stwierdzenia, że OpenOffice był wystarczająco inteligentny, aby wnioskować, a teraz ładuje prawidłową liczbę rekordów:
LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
Ale nadal istnieje wiele całkowicie NULL
zapisów i żadne z załadowanych danych nie wydają się być odpowiednie.
źródło
Odpowiedzi:
Rdzeniem problemu wydaje się być dopasowanie kolumn w pliku CSV do kolumn w tabeli.
Wiele graficznych klientów mySQL ma bardzo ładne okna dialogowe importu do tego rodzaju rzeczy.
Moim ulubionym do pracy jest HeidiSQL oparty na systemie Windows . Daje graficzny interfejs do budowania
LOAD DATA
polecenia; możesz go ponownie użyć programowo później.Zrzut ekranu: okno dialogowe „Importuj plik tekstowy”
Aby otworzyć okno dialogowe Importuj plik tekstowy ”, przejdź do
Tools > Import CSV file
:źródło
Użyj mysqlimport, aby załadować tabelę do bazy danych:
Znalazłem to na http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/
Aby ustawić ogranicznik jako kartę, użyj
--fields-terminated-by='\t'
źródło
mysqlimport
używaLOAD DATA INFILE...
za kulisami, więc jest prawie tak samo.LOAD DATA INFILE
, musisz utworzyć tabelę, zanim będziesz mógł z niej korzystaćmysqlimport
.LOAD DATA INFILE
.--fields-optionally-enclosed-by=\"
i `--fields-escaped-by = \`Najprostszym sposobem, który zaimportowałem ponad 200 wierszy jest polecenie poniżej w oknie phpmyadmin sql
Mam prostą tabelę kraju z dwiema kolumnami CountryId, CountryName
tutaj są dane .csv
oto polecenie:
Pamiętaj o jednej rzeczy, nigdy nie pojawiaj się w drugiej kolumnie, w przeciwnym razie import zostanie zatrzymany
źródło
LOAD DATA LOCAL INFILE
. Jeśli spowoduje to błąd 1148 „użyte polecenie nie jest dozwolone”, możesz je włączyć, uruchamiając mysql w wierszu polecenia za pomocą--local-infile
.Użyłem tej metody do zaimportowania ponad 100 000 rekordów ( ~ 5 MB ) w 0,046 s
Oto jak to zrobić:
Bardzo ważne jest dołączenie ostatniego wiersza, jeśli masz więcej niż jedno pole, tzn. Zwykle pomija ostatnie pole (MySQL 5.6.17)
Następnie, zakładając, że masz pierwszy wiersz jako tytuł swoich pól, możesz również chcieć dołączyć ten wiersz
Tak to wygląda, jeśli plik ma wiersz nagłówka.
źródło
(field_1,field_2 , field_3);
odnosi się do listy kolumn w pliku .csv lub w tabeli? tj. jakie są te pola?phpMyAdmin może obsłużyć import CSV. Oto kroki:
Przygotuj plik CSV, aby pola były w tej samej kolejności, co pola tabeli MySQL.
Usuń wiersz nagłówka z pliku CSV (jeśli istnieje), aby w pliku były tylko dane.
Przejdź do interfejsu phpMyAdmin.
Wybierz tabelę w menu po lewej stronie.
Kliknij przycisk importu u góry.
Przejdź do pliku CSV.
Wybierz opcję „CSV za pomocą LOAD DATA”.
Wpisz „,” w „polach zakończonych przez”.
Wprowadź nazwy kolumn w tej samej kolejności, w jakiej znajdują się w tabeli bazy danych.
Kliknij przycisk Idź i gotowe.
To jest uwaga, którą przygotowałem do mojego przyszłego użytku i dzielę się tutaj, jeśli ktoś inny może skorzystać.
źródło
NULL
w pliku CSV dla pól / kolumn z automatyczną inkrementacją.Możesz to naprawić, wyświetlając kolumny w instrukcji LOAD DATA. Z instrukcji :
... więc w twoim przypadku musisz wymienić 99 kolumn w kolejności, w jakiej pojawiają się w pliku csv.
źródło
Spróbuj, to zadziałało dla mnie
IGNORE 1 ROWS tutaj ignoruje pierwszy wiersz, który zawiera nazwy pól. Zauważ, że w nazwie pliku musisz wpisać bezwzględną ścieżkę do pliku.
źródło
Wiersz polecenia mysql jest podatny na zbyt wiele problemów podczas importowania. Oto jak to zrobić:
źródło
Jeśli używasz MySQL Workbench (obecnie wersja 6.3), możesz to zrobić przez:
źródło
LOAD DATA INFILE
imysqlimport
(„nie jest to obsługiwane w tej wersji mysql”)INSERT
zapytanie i spróbowałbym zrobić to wszystko naraz, ale wygląda na to, że robienie tego w ten sposób działa razINSERT
na rząd.Widzę coś dziwnego. Używasz do UCIECZKI tego samego znaku, którego używasz do ZAKOŃCZENIA. Tak więc silnik nie wie, co zrobić, gdy znajdzie „” i myślę, że dlatego wydaje się, że nic nie jest we właściwym miejscu. Myślę, że jeśli usuniesz linię ESCAPING, powinno działać świetnie.
Chyba że przeanalizujesz (ręcznie, wizualnie ...) swój plik CSV i znajdziesz, która postać używa do ucieczki. Czasami jest „\”. Ale jeśli go nie masz, nie używaj go.
źródło
Jeszcze innym rozwiązaniem jest użycie narzędzia csvsql z niesamowitego pakietu csvkit .
Przykład użycia:
To narzędzie może automatycznie wnioskować o typach danych (zachowanie domyślne), utworzyć tabelę i wstawić dane do utworzonej tabeli.
--overwrite
Opcji można użyć do usunięcia tabeli, jeśli już istnieje.--insert
opcja - aby wypełnić tabelę z pliku.Aby zainstalować pakiet
Wymagania:
python-dev
,libmysqlclient-dev
,MySQL-python
źródło
Jak importować pliki csv do tabel sql
Przykładowy plik: plik
Overseas_trade_index
CSV danychKroki:
Musisz utworzyć tabelę dla
overseas_trade_index
.Musisz utworzyć kolumny związane z plikiem csv.
Zapytanie SQL:
Musisz podłączyć bazę danych mysql w terminalu.
Wprowadź to polecenie, aby zaimportować dane csv do tabel mysql.
Znajdź te dane indeksu handlu zagranicznego w sqldatabase:
źródło
Jeśli używasz komputera z systemem Windows z załadowanym arkuszem kalkulacyjnym Excel, nowa wtyczka mySql do programu Excel jest fenomenalna. Ludzie w Oracle naprawdę wykonali niezłą robotę przy tym oprogramowaniu. Możesz wykonać połączenie z bazą danych bezpośrednio z Excela. Wtyczka przeanalizuje Twoje dane i utworzy dla Ciebie tabele w formacie zgodnym z danymi. Miałem kilka dużych plików CSV z danymi do konwersji. To narzędzie pozwoliło zaoszczędzić dużo czasu.
http://dev.mysql.com/downloads/windows/excel/
Możesz dokonywać aktualizacji z poziomu Excela, które zostaną wprowadzone do bazy danych online. Działa to wyjątkowo dobrze z plikami mySql utworzonymi na bardzo niedrogim hostingu współdzielonym GoDaddy. (Uwaga: gdy tworzysz tabelę w GoDaddy, musisz wybrać niestandardowe ustawienia, aby umożliwić dostęp do bazy danych poza witryną ...)
Dzięki tej wtyczce masz czystą interaktywność między arkuszem kalkulacyjnym XL a internetowym magazynem danych mySql.
źródło
Używam mysql workbench do wykonania tej samej pracy.
Uwaga: spójrz na plik dziennika mysql workbench pod kątem błędów, używając „tail -f [mysqlworkbenchpath] /log/wb*.log”
źródło
Oto przykładowy zrzut ekranu pliku Excel:
Zapisz jako i wybierz .csv.
Będziesz miał, jak pokazano poniżej, zrzut ekranu .csv, jeśli otworzysz za pomocą notatnika ++ lub innego notatnika.
Upewnij się, że usunąłeś nagłówek i wyrównywałeś kolumny w .csv jak w tabeli mysql. Zastąp folder_name nazwą swojego folderu
LOAD DATA LOCAL INFILE
„D: /folder_name/myfilename.csv„ DO TABELI Poczta POLE ZAKOŃCZONE PRZEZ ”,„ (fname, lname, email, telefon);
W przypadku dużych zbiorów danych możesz wziąć kawę i załadować ją !.
To wszystko czego potrzebujesz.
źródło
W przypadku korzystania z Intellij https://www.jetbrains.com/datagrip/features/importexport.html
źródło
Kwerenda PHP dotycząca importu pliku csv do bazy danych mysql
** Przykładowe dane pliku CSV **
źródło
źródło