MYSQL importa i dati da csv utilizzando LOAD DATA INFILE


106

Sto importando alcuni dati di 20000 righe da un file CSV in Mysql.

Le colonne nel CSV sono in un ordine diverso rispetto alle colonne della tabella MySQL. Come assegnare automaticamente le colonne corrispondenti alle colonne della tabella Mysql?

Quando eseguo

LOAD DATA INFILE'abc.csv' INTO TABLE abc

questa query aggiunge tutti i dati alla prima colonna.

Si prega di suggerire la sintassi automatica per l'importazione dei dati in Mysql.



A me è capitato, ho scoperto che il file di testo era scritto con righe terminate da "\ r" e stavo cercando di importare i dati aspettandomi che le righe venissero terminate utilizzando "\ n"
Tamer

2
Ho scritto un ampio tutorial per caricare i dati csv in mysql insieme a uno strumento di generatore di sintassi in Excel . Dovrebbe essere utile ai lettori.
mysql_user

Risposte:


169

È possibile utilizzare il comando LOAD DATA INFILE per importare il file csv nella tabella.

Controlla questo 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...);

Per gli utenti di MySQL 8.0:

L'utilizzo della LOCALparola chiave contiene rischi per la sicurezza e da MySQL 8.0 la LOCALfunzionalità è impostata per Falseimpostazione predefinita. Potresti vedere l'errore:

ERRORE 1148: il comando utilizzato non è consentito con questa versione di MySQL

Puoi sovrascriverlo seguendo le istruzioni nei documenti . Fai attenzione che tale sovrascrittura non risolva il problema di sicurezza, ma piuttosto semplicemente un riconoscimento che sei consapevole e disposto a correre il rischio.


1
Posso sapere cosa IGNORE 1 LINESfa esattamente qui? Grazie in anticipo.
Koushik Das

5
@KoushikDas Ignorerà la prima riga che definisce i nomi delle colonne
Saharsh Shah,

28
attenzione: la clausola LINEE TERMINATE DA "\ r \ n" funziona per i file di Windows, ma i file di Linux dovrebbero avere solo "\ n".
ChuckCottrill

1
È importante ricordare di utilizzare le barre in avanti: stackoverflow.com/a/42878067/470749
Ryan

3
solo una nota che il (col1, col2, col3 ....) non è richiesto. Utile se stai creando una tabella al volo prima di utilizzarla per inserire dati.
Kieran Quinn

51

Probabilmente è necessario impostare FIELDS TERMINATED BY ','o qualunque sia il delimitatore.

Per un file CSV, la tua dichiarazione dovrebbe essere simile a questa:

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

1
LOAD DATA LOCAL INFILE ... Senza LOCAL l'accesso è stato negato.
ketankk

49

Prima di importare il file, è necessario preparare quanto segue:

  • Una tabella di database in cui verranno importati i dati dal file.
  • Un file CSV con dati che corrispondono al numero di colonne della tabella e al tipo di dati in ciascuna colonna.
  • L'account, che si connette al server di database MySQL, dispone dei privilegi FILE e INSERT.

Supponiamo di avere la seguente tabella:

inserisci qui la descrizione dell'immagine

CREA TABELLA UTILIZZANDO LA SEGUENTE DOMANDA:

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
);

IL TUO FILE CSV DEVE ESSERE FORMATTATO CORRETTAMENTE PER ESEMPIO VEDI SEGUENTE IMMAGINE ALLEGATA:

inserisci qui la descrizione dell'immagine

Se tutto va bene .. Si prega di eseguire la seguente query per CARICARE DATI DA FILE CSV:

NOTA: aggiungi il percorso assoluto del tuo file 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;

Se tutto è andato a buon fine. hai esportato correttamente i dati da CSV alla tabella


Come possiamo convalidare se il file CSV ha un tipo di dati corretto per ogni colonna perché per impostazione predefinita ignora il tipo di dati non valido.
Umar Abbas

2
Mi dispiace disturbare una risposta così vecchia. È molto convincente, ma come posso saltare qualche campo. Supponiamo che la mia tabella abbia projectId, surveyId e dateTime, come posso saltare il campo "visualizzazioni"?
Danese Ansari

@ MD Danese Ansari, Mi dispiace rispondere a una vecchia domanda, ma puoi specificare le colonne della tabella. Ho fatto quanto segue, dove devo saltare il primo campo (una chiave primaria di autoincremento), così come alcuni altri campi: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'INTO TABLE my_log_tbl FIELDS TERMINATED BY', 'ENCLOSED BY' "'LINES TERMINATED BY' \ r \ n '(UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); Pensavo che le colonne dovessero venire dopo il nome della tabella, ma non ha funzionato. Dovrebbero apparire alla fine.
kalinma

17

Sintassi:

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}]

Vedi questo esempio:

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;

10

Inserisci in blocco più di 7000000 record in 1 minuto nel database (query superveloce con calcolo)

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 e RRP_nl e RRP_bl non sono in csv ma ​​vengono calcolati e dopo inseriamo quello.


2

Se stai eseguendo LOAD DATA LOCAL INFILEdalla shell di Windows e devi usare OPTIONALLY ENCLOSED BY '"', dovrai fare qualcosa del genere per sfuggire ai caratteri correttamente:

"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

2

supponiamo che tu stia usando xampp e phpmyadmin

hai il nome del file "rating.txt", il nome della tabella "valutazioni" e il nome del database "film"

se il tuo xampp è installato in "C: \ xampp \"

copia il tuo file "Ratings.txt" nella cartella "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;

Spero che questo possa aiutarti a omettere il tuo errore se lo stai facendo su localhost


0

È possibile caricare dati da un file CSV o di testo. Se hai un file di testo con i record di una tabella, puoi caricare quei record all'interno della tabella. Ad esempio, se hai un file di testo, dove ogni riga è un record con i valori per ogni colonna, puoi caricare i record in questo modo.

Table.sql

id //field 1

name //field2

Table.txt

1,peter

2,daniel

...

--esempio su Windows

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 

0

Ricevo il codice di errore: 1290. Il server MySQL è in esecuzione con l'opzione --secure-file-priv, quindi non può eseguire questa istruzione

Questo ha funzionato per me su Windows 8.1 a 64 bit utilizzando wampserver 3.0.6 a 64 bit.

File my.ini modificato da C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Elimina la voce secure_file_priv c: \ wamp64 \ tmp \ (o qualsiasi altra directory che hai qui)

Fermato tutto - esci da wamp ecc. - e riavviato tutto; quindi puntare il mio file cvs su C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (l'ultima directory è il nome del mio database)

eseguito LOAD DATA INFILE 'myfile.csv'

INTO TABLE alumnos

CAMPI TERMINATI DA ","

INCLUSO DA '"'

LINEE TERMINATE DA "\ r \ n"

IGNORA 1 LINEE

... e VOILA !!!


0

Puoi provare a inserire in questo modo:

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.