Importa CSV nella tabella mysql


96

Qual è il modo migliore / più veloce per caricare un file CSV in una tabella mysql? Vorrei che la prima riga di dati venisse utilizzata come nomi di colonna.

Trovato questo:

Come importare file CSV nella tabella MySQL

Ma l'unica risposta era usare una GUI e non una shell?


3
E anche la soluzione GUI non prende i nomi delle colonne dal csv ... è necessario creare l'intera tabella prima dell'importazione-
Dominique

La domanda ha già una risposta qui stackoverflow.com/questions/3635166/…
David

la risposta accettata alla domanda a cui ti stai collegando stava usando una GUI. La risposta che stai facendo è stata fornita ieri mentre questa domanda (risposta) è del 2012.
mcm

Risposte:


147

Invece di scrivere uno script per estrarre le informazioni da un file CSV, puoi collegare MYSQL direttamente ad esso e caricare le informazioni utilizzando la seguente sintassi SQL.

Per importare un file Excel in MySQL, esportalo prima come file CSV. Rimuovi le intestazioni CSV dal file CSV generato insieme ai dati vuoti che Excel potrebbe aver inserito alla fine del file CSV.

Puoi quindi importarlo in una tabella MySQL eseguendo:

load data local infile 'uniq.csv' into table tblUniq fields terminated by ','
  enclosed by '"'
  lines terminated by '\n'
    (uniqName, uniqCity, uniqComments)

come letto: importa il file CSV direttamente in MySQL

MODIFICARE

Nel tuo caso, dovrai prima scrivere un interprete, per trovare la prima riga e assegnarli come nomi di colonna.


EDIT-2

Dai documenti MySQL sulla LOAD DATAsintassi :

L' IGNORE number LINESopzione può essere utilizzata per ignorare le righe all'inizio del file. Ad esempio, puoi utilizzare IGNORE 1 LINESper saltare una riga di intestazione iniziale contenente i nomi delle colonne:

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

Pertanto, puoi utilizzare la seguente dichiarazione:

LOAD DATA LOCAL INFILE 'uniq.csv'
INTO TABLE tblUniq
FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(uniqName, uniqCity, uniqComments)

8
Invece di rimuovere la prima riga, puoi aggiungere IGNORE 1 LINESalla query
mb14

Sai se esiste un modo per impostare il percorso del file nel file csv?
JasonDavis

Come eseguire il debug di questo comando quando fallisce? Sto cercando di caricare un file con questo comando ma non sta facendo nulla.

come se volessi ignorare una colonna in CSV?
Marci-man

come dare il permesso per l'accesso al mio file locale CSV da parte del server mysql in esecuzione su aws (rds)
rahul

24

Ecco un semplice script da riga di comando PHP che farà ciò di cui hai bisogno:

<?php

$host = 'localhost';
$user = 'root';
$pass = '';
$database = 'database';

$db = mysql_connect($host, $user, $pass);
mysql_query("use $database", $db);

/********************************************************************************/
// Parameters: filename.csv table_name

$argv = $_SERVER[argv];

if($argv[1]) { $file = $argv[1]; }
else {
    echo "Please provide a file name\n"; exit; 
}
if($argv[2]) { $table = $argv[2]; }
else {
    $table = pathinfo($file);
    $table = $table['filename'];
}

/********************************************************************************/
// Get the first row to create the column headings

$fp = fopen($file, 'r');
$frow = fgetcsv($fp);

foreach($frow as $column) {
    if($columns) $columns .= ', ';
    $columns .= "`$column` varchar(250)";
}

$create = "create table if not exists $table ($columns);";
mysql_query($create, $db);

/********************************************************************************/
// Import the data into the newly created table.

$file = $_SERVER['PWD'].'/'.$file;
$q = "load data infile '$file' into table $table fields terminated by ',' ignore 1 lines";
mysql_query($q, $db);

?>

Creerà una tabella basata sulla prima riga e vi importerà le righe rimanenti. Ecco la sintassi della riga di comando:

php csv_import.php csv_file.csv table_name

2
Fantastico script. Per quelli con file CSV con doppia citazione (leggi la maggior parte delle persone) aggiungi "ENCASED IN '\"' `a fields terminated by ','... funziona anche con CSV parzialmente con doppia citazione.
Joel Mellon

3
Penso che tu intenda ENCLOSED BY '\"'... inoltre, molte persone avranno bisogno LINES TERMINATED BY '\r\n'se usano un CSV da Windows. E infine, è saggio $columns .= "`$column` varchar(250)";
evitare

1
Questa risposta è molto migliore della risposta accettata. In particolare consente ciò che l'OP ha richiesto, e voglio anche: "la prima riga di dati sia usata come nomi di colonna". (Preferirei uno script in Python, quindi non devo installare PHP, ma non dovrebbe essere difficile portarlo.)
LarsH

2
@YumYumYum Puoi approfondire meglio il problema che stai riscontrando?
Hawkee

Posso offrirti una birra?
Joe

4

se hai la possibilità di installare phpadmin c'è una sezione di importazione dove puoi importare file csv nel tuo database c'è anche una casella di spunta per impostare l'intestazione sulla prima riga del file che contiene i nomi delle colonne della tabella (se questa è deselezionata, il la prima riga diventerà parte dei dati


Sono davvero sorpreso che tu debba utilizzare un componente aggiuntivo come phpadmin per ottenere questa funzionalità, grazie per la tua risposta
chrisfs

Questo ha appena reso la mia giornata
Mark

4

Per prima cosa crea una tabella nel database con lo stesso numero di colonne che si trovano nel file csv.

Quindi utilizzare la seguente query

LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'

come se volessi ignorare una colonna in CSV?
Marci-man

3

Per caricare i dati da file di testo o file csv il comando è

load data local infile 'file-name.csv'
into table table-name
fields terminated by '' enclosed by '' lines terminated by '\n' (column-name);

Nel comando sopra, nel mio caso c'è solo una colonna da caricare quindi non ci sono "terminato da" e "racchiuso da" quindi l'ho tenuto vuoto altrimenti il ​​programmatore può inserire il carattere di separazione. per es. , (virgola) o "o; o qualsiasi cosa.

** per le persone che utilizzano mysql versione 5 e successive **

Prima di caricare il file in mysql bisogna assicurarsi che sotto la linea di traino siano aggiunti a lato etc/mysql/my.cnf

per modificare il comando my.cnf è

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  


2

Ho scritto del codice per farlo, inserirò alcuni snippet:

$dir = getcwd(); // Get current working directory where this .php script lives
$fileList = scandir($dir); // scan the directory where this .php lives and make array of file names

Quindi ottieni le intestazioni CSV in modo da poter dire a mysql come importare (nota: assicurati che le tue colonne mysql corrispondano esattamente alle colonne csv):

//extract headers from .csv for use in import command
$headers = str_replace("\"", "`", array_shift(file($path)));
$headers = str_replace("\n", "", $headers);

Quindi invia la tua query al server mysql:

mysqli_query($cons, '
        LOAD DATA LOCAL INFILE "'.$path.'"
            INTO TABLE '.$dbTable.'  
            FIELDS TERMINATED by \',\' ENCLOSED BY \'"\'
            LINES TERMINATED BY \'\n\'
            IGNORE 1 LINES
            ('.$headers.')
            ;
        ')or die(mysql_error());

1

Ho lottato con questo per un po 'di tempo. Il problema non sta nel come caricare i dati, ma come costruire la tabella per contenerli. È necessario generare un'istruzione DDL per creare la tabella prima di importare i dati.

Particolarmente difficile se la tabella ha un numero elevato di colonne.

Ecco uno script Python che (quasi) fa il lavoro:

#!/usr/bin/python    
import sys
import csv

# get file name (and hence table name) from command line
# exit with usage if no suitable argument   
if len(sys.argv) < 2:
   sys.exit('Usage: ' + sys.argv[0] + ': input CSV filename')
ifile = sys.argv[1]

# emit the standard invocation
print 'create table ' + ifile + ' ('

with open(ifile + '.csv') as inputfile:
   reader = csv.DictReader(inputfile)
   for row in reader:
      k = row.keys()
      for item in k:
         print '`' + item + '` TEXT,'
      break
   print ')\n'

Il problema che lascia da risolvere è che il nome del campo finale e la dichiarazione del tipo di dati terminano con una virgola e il parser mySQL non lo tollererà.

Ovviamente ha anche il problema di utilizzare il tipo di dati TEXT per ogni campo. Se la tabella ha diverse centinaia di colonne, VARCHAR (64) renderà la tabella troppo grande.

Anche questo sembra interrompersi al numero massimo di colonne per mySQL. È allora che è il momento di passare a Hive o HBase, se puoi.


1

Ecco come l'ho fatto in Python usando csv e MySQL Connector :

import csv
import mysql.connector

credentials = dict(user='...', password='...', database='...', host='...')
connection = mysql.connector.connect(**credentials)
cursor = connection.cursor(prepared=True)
stream = open('filename.csv', 'rb')
csv_file = csv.DictReader(stream, skipinitialspace=True)

query = 'CREATE TABLE t ('
query += ','.join('`{}` VARCHAR(255)'.format(column) for column in csv_file.fieldnames)
query += ')'
cursor.execute(query)
for row in csv_file:
    query = 'INSERT INTO t SET '
    query += ','.join('`{}` = ?'.format(column) for column in row.keys())
    cursor.execute(query, row.values())

stream.close()
cursor.close()
connection.close()

Punti chiave

  • Usa istruzioni preparate per INSERT
  • Apri il file.csv in 'rb'binario
  • Alcuni file CSV potrebbero richiedere modifiche , come l' skipinitialspaceopzione.
  • Se 255non è abbastanza ampio riceverai errori su INSERT e dovrai ricominciare da capo.
  • Regola i tipi di colonna, ad es ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • Aggiungi una chiave primaria , ad esALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

0

Importa file CSV nella tabella mysql

LOAD DATA LOCAL INFILE 'd:\\Site.csv' INTO TABLE `siteurl` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

Character   Escape Sequence
\0      An ASCII NUL (0x00) character
\b      A backspace character
\n      A newline (linefeed) character
\r      A carriage return character
\t      A tab character.
\Z      ASCII 26 (Control+Z)
\N      NULL

visite: http://www.webslessons.com/2014/02/import-csv-files-using-php-and-mysql.html


0

Come altri hanno già detto, il file di caricamento locale dei dati funziona perfettamente. Ho provato lo script php che Hawkee ha pubblicato, ma non ha funzionato per me. Invece di eseguire il debug, ecco cosa ho fatto:

1) copia / incolla la riga di intestazione del file CSV in un file txt e modifica con emacs. aggiungi una virgola e una risposta predefinita tra ogni campo per ottenere ciascuno sulla propria riga.
2) Salva quel file come FieldList.txt
3) modifica il file per includere defns per ogni campo (la maggior parte erano varchar, ma alcuni erano int (x). Aggiungi create table tablename (all'inizio del file e) al fine del file Salvalo come CreateTable.sql
4) avvia il client mysql con l'input dal file Createtable.sql per creare la tabella
5) avvia il client mysql, copia / incolla nella maggior parte del comando "LOAD DATA INFILE" che sostituisce la mia tabella nome e nome del file csv. Incolla nel file FieldList.txt. Assicurati di includere "IGNORA 1 LINEE" prima di incollare nell'elenco dei campi

Sembra un sacco di lavoro, ma facile con emacs .....


0

Usa l'applicazione TablePlus: fai clic con il pulsante destro del mouse sul nome della tabella dal pannello di destra Scegli Importa ...> Da CSV Scegli file CSV Verifica la corrispondenza della colonna e premi Importa Tutto fatto!


-3

Ho cercato su google in molti modi per importare csv in mysql, includere "load data infile", utilizzare mysql workbench, ecc.

quando utilizzo il pulsante di importazione del workbench mysql, prima devi creare la tabella vuota da solo, impostare ogni tipo di colonna da solo. Nota: devi aggiungere la colonna ID alla fine come chiave primaria e non null e auto_increment, altrimenti il ​​pulsante di importazione non sarà visibile in seguito. Tuttavia, quando inizio a caricare il file CSV, non viene caricato nulla, sembra un bug. Mi arrendo.

Fortunatamente, il modo migliore che ho trovato finora è usare mysql di Oracle per Excel. puoi scaricarlo da qui mysql per excel

Questo è quello che farai: apri il file csv in Excel, nella scheda Dati, trova mysql per il pulsante Excel

seleziona tutti i dati, fai clic su esporta in mysql. Nota per impostare una colonna ID come chiave primaria.

al termine, vai a mysql workbench per modificare la tabella, ad esempio il tipo di valuta dovrebbe essere decimale (19,4) per grandi quantità decimali (10,2) per un uso regolare. un altro tipo di campo può essere impostato su varchar (255).

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.