Como importo arquivo CSV para uma tabela MySQL?


306

Eu tenho um CSV de diário de eventos não normalizado de um cliente que estou tentando carregar em uma tabela MySQL para que eu possa refatorar em um formato saudável. Criei uma tabela chamada 'CSVImport' que possui um campo para cada coluna do arquivo CSV. O CSV contém 99 colunas, portanto, essa foi uma tarefa bastante difícil:

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

Não há restrições na tabela e todos os campos mantêm valores VARCHAR (256), exceto as colunas que contêm contagens (representadas por INT), sim / não (representadas por BIT), preços (representados por DECIMAL) e sinopse de texto ( representado por TEXT).

Eu tentei carregar dados no arquivo:

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

A mesa inteira está cheia NULL.

Eu acho que o problema é que os anúncios de texto contêm mais de uma linha, e o MySQL está analisando o arquivo como se cada nova linha correspondesse a uma linha do banco de dados. Eu posso carregar o arquivo no OpenOffice sem problemas.

O arquivo clientdata.csv contém 2593 linhas e 570 registros. A primeira linha contém nomes de colunas. Eu acho que é delimitado por vírgula, e o texto é aparentemente delimitado com aspas duplas.

ATUALIZAR:

Em caso de dúvida, leia o manual: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

Adicionei algumas informações à LOAD DATAdeclaração de que o OpenOffice era inteligente o suficiente para inferir e agora carrega o número correto de registros:

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;

Mas ainda existem muitos NULLregistros completos e nenhum dos dados que foram carregados parece estar no lugar certo.


17
E se você estiver em OSX Sequel Pro tem uma ferramenta incrível de importação e é GRÁTIS ;-)
Merrick

41
É incrível para mim que o pôster original tenha respondido melhor à sua própria pergunta do que qualquer outra pessoa ... Não sei por que tantas pessoas estão tão prontas para dar recomendações de software quando existe um comando SQL existente, que pode ser programático em vez da interface do usuário -Sediada. Não conheço mais ninguém, mas programático significa para mim que posso ter scripts configurados para importar automaticamente arquivos em registros de data e hora, enquanto a interface do usuário é puramente manual.
22814 Chris Cirefice

@ ChrisCirefice: Eu acho que a resposta aceita explica isso muito bem. Ele precisava de ajuda para criar manualmente o comando 'load data', com o qual um programa gráfico pode ajudar. Depois que o programa gráfico criar o comando 'carregar dados', ele poderá reutilizá-lo programaticamente.
AlexC # 16/14

@Merrick este trabalhou um mimo no OSX
weaveoftheride

Eu escrevi um extenso tutorial para carregar dados csv no mysql, juntamente com uma ferramenta geradora de sintaxe no Excel .
Mysql_user

Respostas:


133

O núcleo do seu problema parece corresponder as colunas no arquivo CSV com as da tabela.

Muitos clientes gráficos do mySQL têm diálogos de importação muito bons para esse tipo de coisa.

O meu favorito para o trabalho é o HeidiSQL baseado no Windows . Ele fornece uma interface gráfica para criar o LOAD DATAcomando; você pode reutilizá-lo programaticamente mais tarde.

Importar arquivo de texto

Captura de tela: caixa de diálogo "Importar arquivo de texto"

Para abrir a caixa de diálogo Importar arquivo de texto ", vá para Tools > Import CSV file:

insira a descrição da imagem aqui


25
Para o Mac OSX, use o Sequel Pro.
Agi Hammerthief

3
Eu apenas tentei e isso exige que eu crie a tabela primeiro ... em vez de usar os nomes das colunas.
Dominique

3
Você tem que selecionar uma tabela para poder continuar ... e uma vez que todo o ponto é não ter de fazer a mesa ...
Dominique

3
Observe que no Linux, o HeidiSQL funciona muito bem no Wine.
AlejandroVD

1
@Paul, o ponto principal da resposta é que as ferramentas da GUI podem facilitar a correspondência entre as colunas de importação e as colunas da tabela.
Pekka

191

Use mysqlimport para carregar uma tabela no banco de dados:

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

Encontrei-o em http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

Para tornar o delimitador uma guia, use --fields-terminated-by='\t'


6
mysqlimportusa LOAD DATA INFILE...nos bastidores, então é praticamente a mesma coisa.
Mladen Jablanović

8
Assim como LOAD DATA INFILEvocê precisa criar uma tabela antes de poder usar mysqlimport.
Marcus Downing

@ MladenJablanović, definitivamente não é a mesma coisa. Tente importar linhas 1bil. Você vai se surpreender que uma enorme diferença que faz em termos de desempenho
ninjabber

@ninjabber Os documentos dizem que o cliente mysqlimport fornece uma interface de linha de comando para o LOAD DATA INFILE , portanto é teoricamente impossível oferecer qualquer benefício de desempenho LOAD DATA INFILE.
Mladen Jablanović

1
Também precisa --fields-optionally-enclosed-by=\"e `--fields-escaped-by = \`
chaintng

80

A maneira mais simples de importar mais de 200 linhas está abaixo do comando na janela phpmyadmin sql

Eu tenho uma tabela simples do país com duas colunas CountryId, CountryName

aqui estão os dados .csvARQUIVO CSV

aqui está o comando:

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

Lembre-se de uma coisa, nunca apareça, na segunda coluna; caso contrário, sua importação será interrompida


1
'' -> '\ t', '"' -> '' no caso de arquivos TSV e remover a última linha se nenhum cabeçalho (esperança de busca crawlers índice isso)..
Bleeding Fingers

16
Se for um arquivo local, pode ser necessário LOAD DATA LOCAL INFILE. Se isso gerar um erro 1148 "comando usado não é permitido", você poderá habilitá-lo executando o mysql na linha de comando com --local-infile.
Big McLargeHuge

Eu recebi o erro: ERRO 1045 (28000): Acesso negado para o usuário 'usuário' @ '%' (usando a senha: SIM)
ARUNBALAN NV

Você deve conceder todo acesso ao usuário; no painel do administrador, tente importar o script.
DareDevil

1
Estou recebendo este erro: O servidor MySQL está sendo executado com a opção --secure-file-priv, portanto não pode executar esta instrução #
596 Agniswar Bakshi

66

Eu sei que a pergunta é antiga , mas eu gostaria de compartilhar isso

Usei esse método para importar mais de 100 mil registros ( ~ 5 MB ) em 0,046 s

Aqui está como você faz isso:

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

É muito importante incluir a última linha, se você tiver mais de um campo, ou seja, normalmente ele pula o último campo (MySQL 5.6.17)

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

Então, supondo que você tenha a primeira linha como título para seus campos, inclua essa linha também

IGNORE 1 ROWS

É assim que parece se seu arquivo tiver uma linha de cabeçalho.

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

Importei 16k linhas e 48 colunas. Obrigado amigo.
Renjith VR

essa é a melhor solução. Para quem quer saber o quão rápido é isso: importei 3,2 milhões de linhas em menos de 14 segundos em uma instância do AWS Lightsail de US $ 20 / mês, com o servidor MySQL integrado (não um RDS de alto desempenho). Impressionante!
master_gracey

Nesta linha, (field_1,field_2 , field_3);ele se refere à lista de colunas em um arquivo .csv ou em uma tabela? ou seja, quais são esses campos?
tera_789

@ tera_789 Os do seu arquivo csv que provavelmente correspondem à sua tabela
Fahad

Deve seguir o formato dos dados. exemplo (no meu caso) <pre> nome_do_domínio, sobrenome, número de telefone, número de telefone, email, nome, sobrenome, 12-05-2018,54545, faiz @ gmail.com, nome1, sobrenome1,2018-05-12,456, faiz1 @ gmail .com, nome2, sobrenome2,2018-05-12,456, faiz2 @ gmail.com, nome3, sobrenome3,2018-05-22,456, faiz3 @ gmail.com, nome4, sobrenome4,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

O phpMyAdmin pode lidar com a importação de CSV. Aqui estão os passos:

  1. Prepare o arquivo CSV para ter os campos na mesma ordem que os campos da tabela MySQL.

  2. Remova a linha do cabeçalho do CSV (se houver), para que apenas os dados estejam no arquivo.

  3. Vá para a interface do phpMyAdmin.

  4. Selecione a tabela no menu esquerdo.

  5. Clique no botão de importação na parte superior.

  6. Vá para o arquivo CSV.

  7. Selecione a opção "CSV usando LOAD DATA".

  8. Digite "," nos "campos terminados por".

  9. Digite os nomes das colunas na mesma ordem em que estão na tabela do banco de dados.

  10. Clique no botão ir e pronto.

Esta é uma observação que eu preparei para meu uso futuro e que compartilhe aqui se alguém puder se beneficiar.


Isso é bom e simples. Prefiro criar tabelas e colunas via SQL (então pulo a Etapa 9) e inserir dados via importação de CSV. Não se esqueça de definir NULLno CSV qualquer campo / coluna com incremento automático.
silver

Observe que o phpMyAdmin falha miseravelmente quando caracteres cirílicos são incluídos no arquivo CSV, não importa que você diga para usar o utf-8.
21416 Fran Marzoa

Não se esqueça de alterar o tamanho da importação se estiver importando um arquivo CSV grande. BTW não é uma boa opção para arquivos CSV grandes.
Avi

Isso requer o download do arquivo .csv para um cliente Web primeiro, pois você não pode procurar um arquivo CSV local.
Mckenzm 12/09/19

Sim, você pode, precisa marcar a caixa de seleção marcada 'Palavra-chave local' e pode usar um arquivo csv local
chrisfs

12

Você pode corrigir isso listando as colunas na instrução LOAD DATA. Do manual :

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

... portanto, no seu caso, você precisa listar as 99 colunas na ordem em que aparecem no arquivo csv.


8

Tente isso, funcionou para mim

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

IGNORE 1 ROWS aqui ignora a primeira linha que contém os nomes de campo. Observe que, para o nome do arquivo, você deve digitar o caminho absoluto do arquivo.


Esta é a melhor resposta. Por que usar outra ferramenta quando um único comando SQL fará?
Sdgfsdh 29/03

Você sabe como fazer isso funcionar quando você está tentando carregar o arquivo no mysql em execução em um servidor? Ele me pede acesso negado para o arquivo (senha). Onde inserir a senha do local do arquivo csv?
Baktaawar

7

A linha de comando do mysql é propensa a muitos problemas na importação. Aqui está como você faz isso:

  • use o excel para editar os nomes dos cabeçalhos para não ter espaços
  • salvar como .csv
  • use o navegador Navicat Lite Sql gratuito para importar e criar automaticamente uma nova tabela (dê um nome)
  • abra a nova tabela e insira uma coluna de número automático principal para identificação
  • altere o tipo das colunas conforme desejado.
  • feito!

5

Se você estiver usando o MySQL Workbench (versão 6.3), você pode fazer isso:

  1. Clique com o botão direito do mouse em "Tabelas";
  2. Assistente de Importação de Dados de Tabela Escolhida;
  3. Escolha seu arquivo csv e siga as instruções (JSON também pode ser usado); O bom é que você pode criar uma nova tabela com base no arquivo csv que deseja importar ou carregar dados em uma tabela existente

insira a descrição da imagem aqui


+1. Eu usei isto porque mysql continuou me dando erros para LOAD DATA INFILEe mysqlimport( "isto não é suportado nesta versão do mysql")
clmno

Este método funciona, mas é meio lento. Eu pensaria que o uso desse recurso criaria uma INSERTconsulta massiva e tentaria fazer tudo de uma só vez, mas parece que dessa forma, na verdade, é executado uma vez INSERTpor linha.
DaveTheMinion

4

Eu vejo algo estranho. Você está usando para ESCAPAR o mesmo caractere usado para ENCLOSING. Portanto, o mecanismo não sabe o que fazer quando encontra um '"' e acho que é por isso que nada parece estar no lugar certo. Acho que se você remover a linha de ESCAPING, deve executar muito bem.

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

A menos que você analise (manualmente, visualmente, ...) seu CSV e descubra qual personagem usa para escapar. As vezes é '\'. Mas se você não o tiver, não o use.


3

Outra solução é usar a ferramenta csvsql da incrível suíte csvkit .

Exemplo de uso:

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

Essa ferramenta pode inferir automaticamente os tipos de dados (comportamento padrão), criar tabela e inserir os dados na tabela criada. --overwriteA opção pode ser usada para descartar a tabela, se ela já existir. --insertopção - para preencher a tabela do arquivo.

Para instalar o conjunto

pip install csvkit

Pré-requisitos: python-dev , libmysqlclient-dev,MySQL-python

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

3

Como importar arquivos csv para tabelas sql

Arquivo de exemplo: arquivo Overseas_trade_indexCSV de dados

Passos:

  1. Precisa criar tabela para overseas_trade_index.

  2. Precisa criar colunas relacionadas ao arquivo csv.

    Consulta 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. Precisa conectar o banco de dados mysql no terminal.

    =>show databases;
    =>use database;
    =>show tables;
  4. Por favor, insira este comando para importar os dados csv para tabelas 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. Encontre esses dados de índice de comércio exterior no sqldatabase:

    select * from trade_index;

2

Se você estiver usando uma máquina Windows com a planilha do Excel carregada, o novo plug-in mySql no Excel é fenomenal. O pessoal da Oracle realmente fez um bom trabalho nesse software. Você pode fazer a conexão com o banco de dados diretamente do Excel. Esse plug-in analisará seus dados e configurará as tabelas para você em um formato consistente com os dados. Eu tinha alguns arquivos csv monstruosos de dados para converter. Essa ferramenta economizou muito tempo.

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

Você pode fazer atualizações no Excel que serão preenchidas no banco de dados online. Isso funcionou muito bem com arquivos mySql criados em hospedagem compartilhada GoDaddy ultra barata. (Observe que quando você cria a tabela no GoDaddy, é necessário selecionar algumas configurações fora do padrão para ativar o acesso externo ao banco de dados ...)

Com este plugin, você tem pura interatividade entre sua planilha XL e o armazenamento de dados mySql online.


2

Eu uso o mysql workbench para fazer o mesmo trabalho.

  1. criar novo esquema
  2. abrir esquema recém-criado
  3. clique com o botão direito do mouse em "Tabelas" e selecione "Assistente de importação de dados de tabela"
  4. forneça o caminho do arquivo csv e o nome da tabela e, finalmente, configure seu tipo de coluna porque o assistente define o tipo de coluna padrão com base em seus valores.

Nota: verifique se há erros no arquivo de log do mysql workbench usando "tail -f [mysqlworkbenchpath] /log/wb*.log"


Muito obrigado pela sua resposta - sendo novo no MySQL, eu não sabia disso - isso me ajudou com o CSV. Agora, também preciso importar 10 tabelas do Access - você acha que a maneira mais simples será exportar essas tabelas para o Excel, do Excel para CSV e, em seguida, seguir estas etapas?
Naomi

Descobri que esse método não importa todas as linhas :( Das 5.342 linhas, ele importou apenas 2.485 linhas para mim. Por que isso?
Naomi

Hey Naomi, se você verificar o log do mysqlworkbench, ele mostrará por que parou de importar dados. Você pode ter alguns valores nulos ou tipo de incompatibilidade no seu arquivo DB e CSV. Mas eu recomendo seguir a resposta de Juan (logo após mim). Sua solução é melhor e mais limpa do que eu.
Mehdi

1

Aqui está um exemplo de captura de tela do arquivo excel:

insira a descrição da imagem aqui

Salve como e escolha .csv.

E você terá como mostrado abaixo a captura de tela de dados .csv se abrir usando o bloco de notas ++ ou qualquer outro bloco de notas.

insira a descrição da imagem aqui

Certifique-se de remover o cabeçalho e ter alinhamento de coluna em .csv como na tabela mysql. Substitua nome_da_pasta pelo nome da sua pasta

CARREGAR DADOS
INFÍLICOS LOCAIS 'D: /folder_name/myfilename.csv' NA TABELA E-mail CAMPOS TERMINADOS POR ',' (fname, lname, email, phone);

Se for grande volume de dados, você pode tomar café e carregá-lo !.

É tudo o que você precisa.



0

Consulta PHP para importar arquivo csv para banco de dados 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));
   }

** Dados do arquivo CSV de amostra **

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

Altere servername, nome de usuário, senha, dbname, caminho do seu arquivo, tablename e o campo que está no seu banco de dados que você deseja inserir

<?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>'
       }
    ?>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.