Come importare un file CSV in una tabella MySQL?


306

Ho un CSV diario di eventi non normalizzato da un client che sto cercando di caricare in una tabella MySQL in modo da poter eseguire il refactoring in un formato sano. Ho creato una tabella chiamata "CSVImport" che ha un campo per ogni colonna del file CSV. Il CSV contiene 99 colonne, quindi questo è stato un compito abbastanza difficile in sé:

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

Nessun vincolo è presente nella tabella e tutti i campi contengono valori VARCHAR (256), ad eccezione delle colonne che contengono conteggi (rappresentati da INT), sì / no (rappresentato da BIT), prezzi (rappresentati da DECIMAL) e sfocatura del testo ( rappresentato da TEXT).

Ho provato a caricare i dati nel file:

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               | 
...

L'intero tavolo è pieno NULL.

Penso che il problema sia che le sfocature del testo contengono più di una riga e MySQL sta analizzando il file come se ogni nuova riga corrispondesse a una riga del database. Posso caricare il file in OpenOffice senza problemi.

Il file clientdata.csv contiene 2593 righe e 570 record. La prima riga contiene i nomi delle colonne. Penso che sia delimitato da virgole e il testo apparentemente delimitato da una doppia virgoletta.

AGGIORNARE:

In caso di dubbi, leggere il manuale: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

Ho aggiunto alcune informazioni LOAD DATAall'affermazione che OpenOffice era abbastanza intelligente da inferire, e ora carica il numero corretto di record:

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;

Ma ci sono ancora molti NULLrecord completi e nessuno dei dati caricati sembra essere nel posto giusto.


17
E se sei su OSX Sequel Pro ha un fantastico strumento di importazione ed è GRATUITO ;-)
Merrick il

41
È sorprendente per me che il poster originale abbia risposto alla sua domanda meglio di chiunque altro ... Non so perché così tante persone siano così pronte a dare consigli sul software quando esiste un comando SQL esistente, che può essere programmatico piuttosto che UI -basato. Non conosco nessun altro, ma programmatico significa per me che posso avere degli script impostati per importare automaticamente i file su timestamp, mentre basato sull'interfaccia utente è puramente manuale.
Chris Cirefice,

@ChrisCirefice: penso che la risposta accettata lo spieghi bene. Aveva bisogno di un po 'di aiuto per creare manualmente il comando "Carica dati", che può essere d'aiuto un programma grafico. Una volta che il programma grafico aveva creato il comando 'carica dati', poteva quindi riutilizzarlo a livello di codice.
AlexC,

@Merrick ha funzionato a meraviglia su osx
weaveoftheride,

Ho scritto un ampio tutorial per caricare i dati CSV in MySQL insieme a uno strumento generatore di sintassi in Excel .
mysql_user

Risposte:


133

Il nocciolo del problema sembra corrispondere alle colonne nel file CSV a quelle della tabella.

Molti client grafici mySQL hanno finestre di dialogo di importazione molto belle per questo tipo di cose.

Il mio preferito per il lavoro è HeidiSQL basato su Windows . Ti dà un'interfaccia grafica per costruire il LOAD DATAcomando; puoi riutilizzarlo in modo programmatico in seguito.

Importa file di testo

Schermata: finestra di dialogo "Importa file di testo"

Per aprire la finestra di dialogo "Importa file di testo", vai a Tools > Import CSV file:

inserisci qui la descrizione dell'immagine


25
Per Mac OSX, utilizzare Sequel Pro.
Agi Hammerthief

3
L'ho appena provato e mi richiede di creare prima la tabella ... invece di usare i nomi delle colonne.
Dominique,

3
Devi selezionare un tavolo prima di poter continuare ... e poiché il punto non è quello di dover preparare il tavolo ...
Dominique

3
Nota che in Linux, HeidiSQL funziona molto bene con Wine.
AlejandroVD,

1
@Paul il punto centrale della risposta è che gli strumenti della GUI possono semplificare l'abbinamento delle colonne di importazione con le colonne della tabella.
Pekka,

191

Utilizzare mysqlimport per caricare una tabella nel database:

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv

L'ho trovato su http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

Per rendere il delimitatore una scheda, utilizzare --fields-terminated-by='\t'


6
mysqlimportutilizza LOAD DATA INFILE...dietro le quinte, quindi è praticamente la stessa cosa.
Mladen Jablanović,

8
Come per LOAD DATA INFILE, è necessario creare una tabella prima di poter utilizzare mysqlimport.
Marcus Downing,

@ MladenJablanović, sicuramente non è la stessa cosa. Prova a importare righe 1bil. Rimarrai sorpreso dall'enorme differenza in termini di prestazioni
ninjabber il

@ninjabber I documenti dicono che il client mysqlimport fornisce un'interfaccia a riga di comando per LOAD DATA INFILE , quindi è teoricamente impossibile offrire alcun vantaggio in termini di prestazioni LOAD DATA INFILE.
Mladen Jablanović,

1
bisogno anche --fields-optionally-enclosed-by=\"e `--fields-escape-by = \`
chaintng

80

Il modo più semplice che ho importato oltre 200 righe è sotto il comando nella finestra sql phpmyadmin

Ho una semplice tabella di paese con due colonne CountryId, CountryName

ecco i dati .csvFILE CSV

ecco il comando:

LOAD DATA INFILE 'c:/country.csv' 
INTO TABLE country 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

Tieni a mente una cosa, non apparire mai, nella seconda colonna, altrimenti l'importazione si interromperà


1
',' -> '\ t', '"' -> '' in caso di file TSV e rimuovi l'ultima riga se nessuna intestazione (spero che i crawler di ricerca lo indicizzino).
Bleeding Fingers il

16
Se si tratta di un file locale, potrebbe essere necessario LOAD DATA LOCAL INFILE. Se viene generato un errore 1148 "comando usato non consentito", è possibile abilitarlo eseguendo mysql dalla riga di comando con --local-infile.
Big McLarge: enorme

ho ricevuto l'errore: ERRORE 1045 (28000): Accesso negato per l'utente 'utente' @ '%' (utilizzando la password: SÌ)
ARUNBALAN NV

Devi concedere tutto l'accesso all'utente, quindi dal pannello di amministrazione prova a importare lo script.
DareDevil,

1
Ricevo questo errore: il server MySQL è in esecuzione con l'opzione --secure-file-priv quindi non può eseguire questa affermazione
Agniswar Bakshi

66

So che la domanda è vecchio , ma vorrei condividere questo

Ho usato questo metodo per importare più di 100 KB ( ~ 5 MB ) in 0,046 secondi

Ecco come lo fai:

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

È molto importante includere l'ultima riga, se hai più di un campo, cioè normalmente salta l'ultimo campo (MySQL 5.6.17)

LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Quindi, supponendo che tu abbia la prima riga come titolo per i tuoi campi, potresti voler includere anche questa riga

IGNORE 1 ROWS

Questo è come appare se il tuo file ha una riga di intestazione.

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);

Ho importato 16k righe e 48 colonne. Grazie amico.
Renjith VR,

Questa è la soluzione migliore Per chiunque sia curioso di quanto sia veloce: ho importato 3,2 milioni di righe in meno di 14 secondi su un'istanza AWS Lightsail da $ 20 / mese, con il server MySQL integrato (non un RDS ad alte prestazioni). Eccezionale!
master_gracey,

In questa riga, (field_1,field_2 , field_3);fa riferimento all'elenco delle colonne in un file .csv o in una tabella? cioè quali sono questi campi?
tera_789,

@ tera_789 Quelli nel tuo file CSV che probabilmente corrisponderanno al tuo tavolo
Fahad,

Deve seguire il formato dei dati. esempio (per il mio caso) <pre> nome, cognome, dob, numero di telefono, e-mail, nome, cognome, 12-05-2018,54545, faiz @ gmail.com, nome1, lastName1,2018-05-12,456, faiz1 @ gmail .com, name2, lastName2,2018-05-12,456, faiz2 @ gmail.com, name3, lastName3,2018-05-22,456, faiz3 @ gmail.com, name4, lastName4,1988-05-22,456, faiz4 @ gmail.com , name5, lastName5,1988-05-22,456, faiz5 @ gmail.com, name6, lastName6,1987-05-21,456, faiz6 @ gmail.com </pre>
Faiz Ahmed

32

phpMyAdmin può gestire l'importazione CSV. Ecco i passaggi:

  1. Preparare il file CSV in modo che i campi siano nello stesso ordine dei campi della tabella MySQL.

  2. Rimuovere la riga di intestazione dal CSV (se presente), in modo che solo i dati siano nel file.

  3. Vai all'interfaccia phpMyAdmin.

  4. Seleziona la tabella nel menu a sinistra.

  5. Fai clic sul pulsante di importazione in alto.

  6. Passare al file CSV.

  7. Seleziona l'opzione "CSV usando LOAD DATA".

  8. Immettere "," nei "campi terminati da".

  9. Immettere i nomi delle colonne nello stesso ordine in cui si trovano nella tabella del database.

  10. Fai clic sul pulsante Vai e il gioco è fatto.

Questa è una nota che ho preparato per il mio uso futuro e la condivisione qui se qualcun altro può trarne vantaggio.


Questo è buono e semplice. Preferisco creare tabelle e colonne tramite SQL (quindi ignoro il passaggio n. 9) e inserisco i dati tramite l'importazione di CSV. Non dimenticare di impostare NULLnel CSV per eventuali campi / colonne a incremento automatico.
argento

Nota che phpMyAdmin fallisce miseramente quando i caratteri cirillici sono inclusi nel file CSV, indipendentemente dal fatto che tu gli dica di usare utf-8.
Fran Marzoa,

Non dimenticare di modificare le dimensioni di importazione se stai importando file CSV di grandi dimensioni. A proposito, non è una buona opzione per file CSV di grandi dimensioni.
Avi

Ciò richiede innanzitutto il download del file .csv su un client Web poiché non è possibile passare a un file CSV locale.
mckenzm,

Sì, puoi selezionare la casella di controllo "Parola chiave locale" e puoi utilizzare un file CSV locale
chrisfs,

12

È possibile risolvere questo problema elencando le colonne nell'istruzione LOAD DATA. Dal manuale :

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

... quindi nel tuo caso devi elencare le 99 colonne nell'ordine in cui appaiono nel file CSV.


8

Prova questo, ha funzionato per me

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

IGNORA 1 ROWS qui ignora la prima riga che contiene i nomi dei campi. Si noti che per il nome file è necessario digitare il percorso assoluto del file.


Questa è la risposta migliore Perché usare un altro strumento quando farà un singolo comando SQL?
sdgfsdh,

Sai come farlo funzionare quando stai provando a caricare il file in mysql in esecuzione su un server? Mi chiede l'accesso negato per il file (password). Dove inserire la password del percorso del file CSV?
Baktaawar,

7

La riga di comando mysql è soggetta a troppi problemi durante l'importazione. Ecco come lo fai:

  • usa Excel per modificare i nomi delle intestazioni per non avere spazi
  • salva come .csv
  • usa il Navicat Lite Sql Browser gratuito per importare e creare automaticamente una nuova tabella (dagli un nome)
  • apri la nuova tabella inserisci una colonna di numero automatico principale per ID
  • cambiare il tipo di colonne come desiderato.
  • fatto!

5

Se stai usando MySQL Workbench (attualmente versione 6.3) puoi farlo tramite:

  1. Fare clic destro su "Tabelle";
  2. Procedura guidata di importazione dei dati della tabella scelta;
  3. Scegli il tuo file csv e segui le istruzioni (potrebbe essere usato anche JSON); La cosa buona è che puoi creare una nuova tabella basata sul file csv che vuoi importare o caricare dati in una tabella esistente

inserisci qui la descrizione dell'immagine


+1. L'ho usato perché mysql continuava a darmi errori per LOAD DATA INFILEe mysqlimport("questo non è supportato su questa versione di mysql")
clmno

Questo metodo funziona, ma è un po 'lento. Avrei pensato che l'uso di questa funzione avrebbe creato una INSERTquery enorme e provato a farlo tutto in una volta, ma sembra che farlo in questo modo venga effettivamente eseguito una volta INSERTper riga.
DaveTheMinion,

4

Vedo qualcosa di strano. Stai usando per FUGARE lo stesso carattere che usi per INCENDERE. Quindi il motore non sa cosa fare quando trova un "" 'e penso che sia per questo che nulla sembra essere nel posto giusto. Penso che se si rimuove la linea di ESCAPING, dovrebbe funzionare alla grande. Come:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

A meno che non analizzi (manualmente, visivamente, ...) il tuo CSV e trovi quale personaggio usa per scappare. A volte è '\'. Ma se non lo hai, non usarlo.


3

Un'altra soluzione è utilizzare lo strumento csvsql dalla straordinaria suite csvkit .

Esempio di utilizzo:

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

Questo strumento può inferire automaticamente i tipi di dati (comportamento predefinito), creare una tabella e inserire i dati nella tabella creata. --overwriteopzione può essere utilizzata per eliminare la tabella se esiste già. --insertopzione - per popolare la tabella dal file.

Per installare la suite

pip install csvkit

Prerequisiti: python-dev , libmysqlclient-dev,MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python

3

Come importare file CSV su tabelle sql

File di esempio: file Overseas_trade_indexCSV di dati

passi:

  1. È necessario creare una tabella per overseas_trade_index.

  2. È necessario creare colonne relative al file CSV.

    Query SQL:

    ( id int not null primary key auto_increment,
    series_reference varchar (60),
    period varchar (60),
    data_value decimal(60,0),
    status varchar (60),
    units varchar (60),
    magnitude int(60),
    subject text(60),
    group text(60),
    series_title_1 varchar (60),
    series_title_2 varchar (60),
    series_title_3 varchar (60),
    series_title_4 varchar (60),
    series_title_5 varchar (60),
     );
  3. È necessario collegare il database mysql nel terminale.

    =>show databases;
    =>use database;
    =>show tables;
  4. Immettere questo comando per importare i dati CSV nelle tabelle mysql.

    load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);
  5. Trova i dati di questo indice commerciale estero su sqldatabase:

    select * from trade_index;

2

Se stai utilizzando un computer Windows con foglio di calcolo Excel caricato, il nuovo plug-in mySql su Excel è fenomenale. La gente di Oracle ha fatto davvero un buon lavoro su quel software. È possibile effettuare la connessione al database direttamente da Excel. Quel plug-in analizzerà i tuoi dati e configurerà le tabelle per te in un formato coerente con i dati. Ho avuto alcuni grandi file di dati CSV mostruosi da convertire. Questo strumento è stato un grande risparmio di tempo.

http://dev.mysql.com/downloads/windows/excel/

È possibile effettuare aggiornamenti da Excel che verranno compilati nel database online. Questo ha funzionato molto bene con i file mySql creati su hosting condiviso GoDaddy ultra economico. (Nota quando crei la tabella su GoDaddy, devi selezionare alcune impostazioni fuori standard per abilitare l'accesso fuori sede del database ...)

Con questo plugin hai una pura interattività tra il tuo foglio di calcolo XL e l'archiviazione dei dati mySql online.


2

Uso mysql workbench per fare lo stesso lavoro.

  1. creare un nuovo schema
  2. aprire lo schema appena creato
  3. fare clic destro su "Tabelle" e selezionare "Importazione guidata dati tabella"
  4. fornire il percorso del file CSV e il nome della tabella e infine configurare il tipo di colonna poiché la procedura guidata ha impostato il tipo di colonna predefinito in base ai loro valori.

Nota: dai un'occhiata al file di registro di mysql workbench per eventuali errori usando "tail -f [mysqlworkbenchpath] /log/wb*.log"


Grazie mille per la tua risposta - essendo nuovo su MySQL di cui non sapevo nulla - mi ha aiutato con CSV. Ora devo anche importare 10 tabelle da Access: pensi che il modo più semplice sarà esportare queste tabelle in Excel, da Excel a CSV e quindi utilizzare questi passaggi?
Naomi

Ho scoperto che questo metodo non importa tutte le righe :( Su 5.342 righe ha importato solo 2.485 righe per me. Perché?
Naomi,

Ehi Naomi, se controlli il registro mysqlworkbench ti mostrerà perché ha smesso di importare i dati. Potresti avere alcuni valori nulli o un tipo di mancata corrispondenza nel tuo file DB e CSV. Ma consiglio vivamente di seguire la risposta di Juan (subito dopo di me). La sua soluzione è migliore e più pulita di me.
Mehdi

1

Ecco una schermata di esempio del file Excel:

inserisci qui la descrizione dell'immagine

Salva con nome e scegli .csv.

E avrai come mostrato di seguito la schermata dei dati .csv se apri usando notepad ++ o qualsiasi altro blocco note.

inserisci qui la descrizione dell'immagine

Assicurati di rimuovere l'intestazione e di avere l'allineamento delle colonne in .csv come nella tabella mysql. Sostituisci nome_cartella con il nome della tua cartella

CARICA DATI LOCALI INFILE
'D: /folder_name/myfilename.csv' IN TABLE mail CAMPI TERMINATI DA ',' (fname, lname, email, telefono);

Se i big data, puoi prendere il caffè e farlo caricare !.

Questo è tutto ciò di cui hai bisogno.



0

Query PHP per importare file csv nel database mysql

$query = <<<EOF
            LOAD DATA LOCAL INFILE '$file'
             INTO TABLE users
             FIELDS TERMINATED BY ','
             LINES TERMINATED BY '\n'
             IGNORE 1 LINES
            (name,mobile,email)
    EOF;
if (!$result = mysqli_query($this->db, $query))
   {
        exit(mysqli_error($this->db));
   }

** Dati di esempio di file CSV **

name,mobile,email
Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus

0

Cambia servername, username, password, dbname, percorso del tuo file, tablename e il campo che si trova nel tuo database che vuoi inserire

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "bd_dashboard";
    //For create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    $query = "LOAD DATA LOCAL INFILE 
                'C:/Users/lenovo/Desktop/my_data.csv'
                INTO TABLE test_tab
                FIELDS TERMINATED BY ','
                LINES TERMINATED BY '\n'
                IGNORE 1 LINES
                (name,mob)";
    if (!$result = mysqli_query($conn, $query)){
        echo '<script>alert("Oops... Some Error occured.");</script>';
        exit();
            //exit(mysqli_error());
       }else{
        echo '<script>alert("Data Inserted Successfully.");</script>'
       }
    ?>
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.