2012-11-27 16 views
32

Ho un file 350 MB di nome text_file.txt contenente questa scheda dati delimitati:Come importare dati da file di testo al database mysql

345868230 1646198120 1531283146 Keyword_1531283146 1.55 252910000 
745345566 1646198120 1539847239 another_1531276364 2.75 987831000 
... 

nome del database MySQL: Xml_Date

tabella del database: PerformanceReport

Ho già creato la tabella con tutti i campi di destinazione.

Voglio importare questi dati di file di testo in un MySQL. Ho cercato su Google e trovato alcuni comandi come LOAD DATA INFILE e abbastanza confuso su come usarlo.

Come posso importare questi dati di file di testo?

risposta

46

Dovrebbe essere semplice come ...

LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport; 

Per default LOAD DATA INFILE utilizza tabulazioni una riga per riga, viene quindi prendere in bene.

+1

in che modo il codice sopra può capire in quale database questo inserirà record? – LOKESH

+1

@LOKESH: in isolamento, non può. In precedenza, dovrai impostare il database che stai utilizzando con il comando USE. –

+0

Penso che il datatable debba essere creato anche nel database affinché funzioni? – HattrickNZ

11

Se la tabella è separato da altri che le schede, è necessario specificare le cose come ...

LOAD DATA LOCAL 
    INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport 
    COLUMNS TERMINATED BY '\t' ## This should be your delimiter 
    OPTIONALLY ENCLOSED BY '"'; ## ...and if text is enclosed, specify here 
+0

puoi elaborare la tua risposta? –

+1

E potresti "leggere" la documentazione? I due parametri aggiuntivi che ho aggiunto alla risposta accettata sono definiti nei commenti; con un #. – peixe

+1

Grazie peixe. Ci hai aiutato su [Here] (http://stackoverflow.com/a/38385192) – Drew

33

Procedura dettagliata sull'uso di comando LOAD DATA di MySQL:

  1. creare la tabella:

    CREATE TABLE foo(myid INT, mymessage VARCHAR(255), mydecimal DECIMAL(8,4)); 
    
  2. Crea tab deli file di mited (nota ci sono le schede tra le colonne):

    1 Heart disease kills  1.2 
    2 one out of every two 2.3 
    3 people in America.  4.5 
    
  3. utilizzare il comando LOAD DATA:

    LOAD DATA LOCAL INFILE '/tmp/foo.txt' 
    INTO TABLE foo COLUMNS TERMINATED BY '\t'; 
    

    Se si ottiene un messaggio di avviso che questo comando non può essere eseguito, allora hai per abilitare il parametro --local-infile=1 descritte in: How can I correct MySQL Load Error

  4. le righe vengono inserite:

    Query OK, 3 rows affected (0.00 sec) 
    Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 
    
  5. Verificare se ha funzionato:

    mysql> select * from foo; 
    +------+----------------------+-----------+ 
    | myid | mymessage   | mydecimal | 
    +------+----------------------+-----------+ 
    | 1 | Heart disease kills | 1.2000 | 
    | 2 | one out of every two | 2.3000 | 
    | 3 | people in America. | 4.5000 | 
    +------+----------------------+-----------+ 
    3 rows in set (0.00 sec) 
    

Come specificare le colonne da caricare le colonne del file di testo in:

Ti piace questa:

LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo 
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' 
(@col1,@col2,@col3) set [email protected],[email protected]; 

Il file i contenuti vengono inseriti nelle variabili @ col1, @ col2, @ col3. myid ottiene la colonna 1 e mydecimal ottiene la colonna 3.Se questo fosse eseguito, sarebbe omettere la seconda fila:

mysql> select * from foo; 
+------+-----------+-----------+ 
| myid | mymessage | mydecimal | 
+------+-----------+-----------+ 
| 1 | NULL  | 1.2000 | 
| 2 | NULL  | 2.3000 | 
| 3 | NULL  | 4.5000 | 
+------+-----------+-----------+ 
3 rows in set (0.00 sec) 
+0

Sulla mia versione di MySQL (Ver 14.14 Distrib 5.5.41), avevo bisogno di omettere LOCAL da questi comandi. (ERRORE 1148 (42000): il comando usato non è consentito con questa versione di MySQL) – ManInTheArena

+0

La parola chiave LOCAL influenza la posizione prevista del file e la gestione degli errori. LOCAL funziona solo se il tuo server e il tuo client sono stati entrambi configurati per permetterlo. https://dev.mysql.com/doc/refman/5.0/en/load-data.html –

3

La dichiarazione LOAD DATA INFILE legge le righe da un file di testo in una tabella ad una velocità molto elevata.

LOAD DATA INFILE '/tmp/test.txt' 
INTO TABLE test 
FIELDS TERMINATED BY ',' 
LINES STARTING BY 'xxx'; 

Se il file di dati si presenta così:

xxx"abc",1 
something xxx"def",2 
"ghi",3 

Le righe risultanti saranno ("abc", 1) e ("def", 2). La terza riga del file viene saltata perché non contiene il prefisso.

LOAD DATA INFILE 'data.txt' 
INTO TABLE tbl_name 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n' 

È anche possibile caricare file di dati utilizzando l'utilità mysqlimport; opera inviando una dichiarazione DATA INFILE LOAD al server

mysqlimport -u root -ptmppassword --local test employee.txt 

test.employee: Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 
0

È necessario impostare l'opzione:

local-infile=1 

nel vostro ingresso [mysql] di my.cnf cliente file o chiamata mysql con il - opzione -local-infile:

mysql --local-infile -uroot -pyourpwd yourdbname 

dovete essere sicuri che lo stesso parametro è definito nella vostra sezione [mysqld] troppo per abilitare la funzione lato server "locale infile".

È una limitazione di sicurezza.

LOAD DATA LOCAL INFILE '/softwares/data/data.csv' INTO TABLE tableName; 
Problemi correlati