MYSQL importa dados de csv usando LOAD DATA INFILE

106

Estou importando alguns dados de 20.000 linhas de um arquivo CSV para o Mysql.

As colunas no CSV estão em uma ordem diferente das colunas da tabela do MySQL. Como atribuir automaticamente colunas correspondentes às colunas da tabela Mysql?

Quando eu executo

LOAD DATA INFILE'abc.csv' INTO TABLE abc

esta consulta adiciona todos os dados à primeira coluna.

Por favor, sugira sintaxe automática para importar dados para o Mysql.

MANJEET
fonte
Há um tópico semelhante em stackoverflow.com/questions/11077801/import-csv-to-mysql-table/…
marciomolusco
Aconteceu comigo, descobri que o arquivo de texto estava escrito com linhas terminadas por '\ r' e estava tentando importar os dados esperando que as linhas terminassem usando o '\ n'
Tamer
2
Escrevi um extenso tutorial para carregar dados csv no mysql junto com uma ferramenta geradora de sintaxe no Excel . Deve ser útil para os leitores.
mysql_user

Respostas:

169

Você pode usar LOAD DATA INFILE comando para importar o arquivo csv para a tabela.

Verifique neste 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...);

Para usuários do MySQL 8.0:

O uso da LOCALpalavra - chave contém riscos de segurança e, a partir do MySQL 8.0, o LOCALrecurso é definido como Falsepadrão. Você pode ver o erro:

ERROR 1148: O comando usado não é permitido com esta versão do MySQL

Você pode substituí-lo seguindo as instruções nos documentos . Esteja ciente de que essa substituição não resolve o problema de segurança, mas apenas reconhece que você está ciente e disposto a correr o risco.

Saharsh Shah
fonte
1
Posso saber o que IGNORE 1 LINESexatamente faz aqui? Desde já, obrigado.
Koushik Das
5
@KoushikDas Irá ignorar a primeira linha que define os nomes das colunas
Saharsh Shah
28
atenção: a cláusula LINES TERMINATED BY '\ r \ n' funciona para arquivos do Windows, mas os arquivos do Linux devem ter apenas '\ n'.
ChuckCottrill de
1
Importante lembrar de usar barras normais: stackoverflow.com/a/42878067/470749
Ryan
3
apenas uma observação de que (col1, col2, col3 ....) não é necessário. Útil se você estiver criando uma tabela dinamicamente antes de usá-la para inserir dados.
Kieran Quinn
51

Você provavelmente precisará definir o FIELDS TERMINATED BY ','ou qualquer outro delimitador.

Para um arquivo CSV, sua declaração deve ser assim:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
ckim
fonte
1
LOAD DATA LOCAL INFILE ... Sem LOCAL o acesso foi negado.
Ketankk
49

Antes de importar o arquivo, você deve preparar o seguinte:

  • Uma tabela de banco de dados para a qual os dados do arquivo serão importados.
  • Um arquivo CSV com dados que correspondem ao número de colunas da tabela e ao tipo de dados em cada coluna.
  • A conta, que se conecta ao servidor de banco de dados MySQL, tem privilégios FILE e INSERT.

Suponha que temos a seguinte tabela:

insira a descrição da imagem aqui

CRIAR TABELA USANDO A SEGUINTE CONSULTA:

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

SEU ARQUIVO CSV DEVE SER FORMATADO CORRETAMENTE PARA EXEMPLO, VEJA A SEGUINTE IMAGEM ANEXA:

insira a descrição da imagem aqui

Se tudo estiver bem ... Execute a seguinte consulta para CARREGAR DADOS DO ARQUIVO CSV:

NOTA: Por favor, adicione o caminho absoluto do seu arquivo 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 tudo estiver feito. você exportou dados de CSV para a tabela com sucesso

Sunny SM
fonte
Como podemos validar se o arquivo CSV tem o tipo de dados adequado para cada coluna porque por padrão ele ignora o tipo de dados inválido.
Umar Abbas
2
Desculpe perturbar em uma resposta tão antiga. É muito convincente, mas como posso pular algum campo. Digamos que minha tabela tenha projectId, surveyId e dateTime, como posso pular o campo "visualizações"?
dinamarquês Ansari
@MD Danish Ansari, Desculpe responder a uma pergunta antiga, mas você pode especificar as colunas da tabela. Fiz o seguinte, onde preciso pular o primeiro campo (uma chave primária de incremento automático), bem como alguns outros campos: 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); Eu pensei que as colunas deveriam vir após o nome da mesa, mas não funcionou. Eles deveriam aparecer no final.
kalinma
17

Sintaxe:

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

Veja este exemplo:

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;
Md. Nashir Uddin
fonte
10

Insira em massa mais de 7000000 registro em 1 minuto no banco de dados (consulta super rápida com cálculo)

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 não estão em csv, mas somos calculados e depois inserimos isso.

Krunal panchal
fonte
2

Se você estiver executando a LOAD DATA LOCAL INFILEpartir do shell do Windows e precisar usar OPTIONALLY ENCLOSED BY '"', você terá que fazer algo assim para escapar os caracteres corretamente:

"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
Kikoz
fonte
2

vamos supor que você esteja usando xampp e phpmyadmin

você tem o nome do arquivo 'ratings.txt', o nome da tabela 'avaliações' e o nome do banco de dados 'filmes'

se o seu xampp estiver instalado em "C: \ xampp \"

copie seu arquivo "ratings.txt" na pasta "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;

Espero que isso possa ajudá-lo a omitir seu erro se você estiver fazendo isso no localhost

Mohammad Arshi
fonte
0

Você pode carregar dados de um arquivo csv ou de texto. Se você tiver um arquivo de texto com registros de uma tabela, poderá carregar esses registros dentro da tabela. Por exemplo, se você tiver um arquivo de texto, onde cada linha é um registro com os valores de cada coluna, você pode carregar os registros desta forma.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

--exemplo em janelas

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

Eu estava recebendo o código de erro: 1290. O servidor MySQL está sendo executado com a opção --secure-file-priv, por isso não pode executar esta instrução

Isso funcionou para mim no Windows 8.1 de 64 bits usando wampserver 3.0.6 de 64 bits.

Arquivo my.ini editado de C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Exclua a entrada secure_file_priv c: \ wamp64 \ tmp \ (ou qualquer diretório que você tenha aqui)

Parou tudo -exit wamp etc.- e reiniciou tudo; então punt meu arquivo cvs em C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (o último dir sendo meu nome de banco de dados)

executado LOAD DATA INFILE 'myfile.csv'

INTO TABLE ex-alunos

CAMPOS TERMINADOS POR ','

CERCADO POR '"'

LINHAS TERMINADAS POR '\ r \ n'

IGNORE 1 LINHAS

... e VOILA !!!

Carlos garcia
fonte
0

Você pode tentar inserir assim:

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

Por estes dias (terminando em 2019) eu prefiro usar uma ferramenta como http://www.convertcsv.com/csv-to-sql.htm Se você tem muitas linhas, pode executar blocos particionados evitando erros do usuário quando o csv vem uma planilha de usuário final.

Jonathan Perrotta
fonte