MYSQL importuje dane z csv przy użyciu LOAD DATA INFILE

106

Importuję niektóre dane 20000 wierszy z pliku CSV do MySQL.

Kolumny w CSV są w innej kolejności niż kolumny tabeli MySQL. Jak automatycznie przypisać kolumny odpowiadające kolumnom tabeli MySQL?

Kiedy wykonuję

LOAD DATA INFILE'abc.csv' INTO TABLE abc

to zapytanie dodaje wszystkie dane do pierwszej kolumny.

Proszę zasugerować automatyczną składnię importu danych do MySQL.

MANJEET
źródło
Zdarzyło mi się to, dowiedziałem się, że plik tekstowy został napisany z liniami zakończonymi przez '\ r' i próbowałem zaimportować dane, spodziewając się, że linie zostaną zakończone za pomocą '\ n'
Tamer
2
Napisałem obszerny samouczek dotyczący ładowania danych csv do mysql wraz z narzędziem do generowania składni w programie Excel . Powinien przydać się czytelnikom.
mysql_user

Odpowiedzi:

170

Możesz użyć polecenia LOAD DATA INFILE, aby zaimportować plik csv do tabeli.

Sprawdź ten link MySQL - LOAD DATA INFILE .

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

Dla użytkowników MySQL 8.0:

Użycie LOCALsłowa kluczowego utrzymuje zagrożenia bezpieczeństwa, a od MySQL 8.0 funkcja LOCALjest Falsedomyślnie ustawiona na . Możesz zobaczyć błąd:

BŁĄD 1148: Użyte polecenie nie jest dozwolone w tej wersji MySQL

Możesz go zastąpić, postępując zgodnie z instrukcjami w dokumentach . Pamiętaj, że takie nadpisanie nie rozwiązuje problemu z bezpieczeństwem, a raczej potwierdza, że ​​jesteś świadomy i chcesz podjąć ryzyko.

Saharsh Shah
źródło
1
Czy mogę wiedzieć, co IGNORE 1 LINESdokładnie tutaj robi? Z góry dziękuję.
Koushik Das
5
@KoushikDas Zignoruje pierwszą linię, która definiuje nazwy kolumn
Saharsh Shah
28
uwaga: klauzula LINES TERMINATED BY '\ r \ n' działa dla plików Windows, ale pliki linux powinny mieć tylko '\ n'.
ChuckCottrill
1
Ważne, aby pamiętać o używaniu ukośników: stackoverflow.com/a/42878067/470749
Ryan
3
tylko uwaga, że ​​(kol1, kol2, kol3 ....) nie jest wymagane. Przydatne, jeśli tworzysz tabelę w locie, zanim użyjesz tego do wstawienia danych.
Kieran Quinn
51

Prawdopodobnie musisz ustawić FIELDS TERMINATED BY ',' separator lub cokolwiek to jest.

W przypadku pliku CSV wyciąg powinien wyglądać następująco:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
ckim
źródło
1
LOAD DATA LOCAL INFILE ... Bez LOCAL odmowa dostępu.
ketankk
49

Przed zaimportowaniem pliku musisz przygotować:

  • Tabela bazy danych, do której zostaną zaimportowane dane z pliku.
  • Plik CSV zawierający dane zgodne z liczbą kolumn tabeli i typem danych w każdej kolumnie.
  • Konto, które łączy się z serwerem bazy danych MySQL, ma uprawnienia FILE i INSERT.

Załóżmy, że mamy następującą tabelę:

wprowadź opis obrazu tutaj

UTWÓRZ TABELĘ NA PODSTAWIE PONIŻSZEGO PYTANIA:

CREATE TABLE IF NOT EXISTS `survey` (
  `projectId` bigint(20) NOT NULL,
  `surveyId` bigint(20) NOT NULL,
  `views` bigint(20) NOT NULL,
  `dateTime` datetime NOT NULL
);

TWÓJ PLIK CSV MUSI BYĆ POPRAWNIE SFORMATOWANY, NA PRZYKŁAD ZOBACZ NASTĘPUJĄCY OBRAZ:

wprowadź opis obrazu tutaj

Jeśli wszystko jest w porządku .. Wykonaj następujące zapytanie, aby wczytać dane z pliku CSV:

UWAGA: dodaj bezwzględną ścieżkę do pliku CSV

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Jeśli wszystko się stało. pomyślnie wyeksportowałeś dane z CSV do tabeli

Sunny SM
źródło
Jak możemy sprawdzić, czy plik CSV ma właściwy typ danych dla każdej kolumny, ponieważ domyślnie ignoruje nieprawidłowy typ danych.
Umar Abbas
2
Przepraszam, że przeszkadzam tak starej odpowiedzi. To bardzo przekonujące, ale jak mogę pominąć jakąś dziedzinę. Powiedzmy, że moja tabela ma projectId, surveyId i dateTime, jak mogę pominąć pole „widoki”?
Duński Ansari,
@MD Danish Ansari, Przepraszam, że odpowiadam na stare pytanie, ale możesz określić kolumny tabeli. Wykonałem następujące czynności, w których muszę pominąć pierwsze pole (klucz podstawowy autoincrement), a także kilka innych pól: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'INTO TABLE my_log_tbl FIELDS TERMINATED BY', 'ENCLOSED BY' "'LINIE ZAKOŃCZONE PRZEZ' \ r \ n '(UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); Myślałem, że kolumny powinny znajdować się po nazwa tabeli, ale to nie zadziałało, powinny pojawić się na końcu
kalinma
17

Składnia:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name' INTO TABLE `tbl_name`
CHARACTER SET [CHARACTER SET charset_name]
FIELDS [{FIELDS | COLUMNS}[TERMINATED BY 'string']] 
[LINES[TERMINATED BY 'string']] 
[IGNORE number {LINES | ROWS}]

Zobacz ten przykład:

LOAD DATA LOCAL INFILE
'E:\\wamp\\tmp\\customer.csv' INTO TABLE `customer`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
Md. Nashir Uddin
źródło
10

Wstaw zbiorczo ponad 7000000 rekordów w ciągu 1 minuty do bazy danych (superszybkie zapytanie z obliczeniami)

mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ');
$affected = (int) (mysqli_affected_rows($cons))-1; 
$log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP i RRP_nl i RRP_bl nie są w csv, ale obliczamy to i wstawiamy tamto.

krunal panchal
źródło
2

Jeśli korzystasz LOAD DATA LOCAL INFILEz powłoki systemu Windows i musisz użyć OPTIONALLY ENCLOSED BY '"', będziesz musiał zrobić coś takiego, aby poprawnie uciec przed znakami:

"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql" -u root --password=%password% -e "LOAD DATA LOCAL INFILE '!file!' INTO TABLE !table! FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"^""' LINES TERMINATED BY '\n' IGNORE 1 LINES" --verbose --show-warnings > mysql_!fname!.out
Kikoz
źródło
2

załóżmy, że używasz xampp i phpmyadmin

masz nazwę pliku „ratings.txt” nazwę tabeli „oceny” i nazwę bazy danych „filmy”

jeśli twój xampp jest zainstalowany w "C: \ xampp \"

skopiuj plik „ratings.txt” do folderu „C: \ xampp \ mysql \ data \ movies”

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

Mam nadzieję, że pomoże ci to pominąć błąd, jeśli robisz to na hoście lokalnym

Mohammad Arshi
źródło
0

Możesz załadować dane z pliku CSV lub pliku tekstowego. Jeśli masz plik tekstowy z rekordami z tabeli, możesz załadować te rekordy w tabeli. Na przykład, jeśli masz plik tekstowy, w którym każdy wiersz jest rekordem z wartościami dla każdej kolumny, możesz w ten sposób załadować rekordy.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

- przykład w systemie Windows

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 
Jorge T
źródło
0

Otrzymuję kod błędu: 1290. Serwer MySQL działa z opcją --secure-file-priv, więc nie może wykonać tej instrukcji

To zadziałało dla mnie w systemie Windows 8.1 64-bitowym przy użyciu wampserver 3.0.6 64bit.

Edytowano plik my.ini z C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Usuń wpis secure_file_priv c: \ wamp64 \ tmp \ (lub jakikolwiek katalog, który tu masz)

Zatrzymałem wszystko - wyjdź z wampa itp. - i ponownie uruchom wszystko; następnie umieść mój plik cvs w C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (ostatni katalog to nazwa mojej bazy danych)

wykonano LOAD DATA INFILE „myfile.csv”

INTO TABLE alumnos

POLA ZAKOŃCZONE PRZEZ „,”

ZAŁĄCZONE PRZEZ „” ”

LINIE ZAKOŃCZONE PRZEZ „\ r \ n”

IGNORUJ 1 LINIE

... i VOILA !!!

Carlos Garcia
źródło
0

Możesz spróbować wstawić w ten sposób:

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);
Hozayfa
źródło
0

Do tych dni (kończących się w 2019 r.) Wolę używać narzędzia takiego jak http://www.convertcsv.com/csv-to-sql.htm Mam wiele wierszy, w których można uruchamiać podzielone na partycje bloki, zapisując błędy użytkowników, gdy pochodzą z csv arkusz kalkulacyjny użytkownika końcowego.

Jonathan Perrotta
źródło