it-swarm-pt.tech

Como importar vários arquivos CSV para um banco de dados MySQL

Existe uma maneira de importar vários arquivos csv ao mesmo tempo para um banco de dados MySQL? Algum tipo de importação em lote?

Estou no Mac OSX executando um servidor MAMP.

Eu tenho 185 arquivos csv que preciso importar para uma tabela MySQL. Posso importá-los individualmente usando a guia de importação do phpMyAdmin, mas isso levaria muito tempo. Alguém sabe se existe uma maneira melhor?

13
Laxmidi

Use um script do Shell como este:

#!/usr/bin/env bash
cd yourdirectory
for f in *.csv
do
        mysql -e "USE yourDatabase LOAD DATA LOCAL INFILE '"$f"'INTO TABLE yourtable"
done
14
nazar554

Existe um pequeno script PHP para você:

#!/usr/bin/php
<?
mysql_connect('localhost','root','root'); // MAMP defaults
mysql_select_db('yourdatabase');
$files = glob('*.csv');
foreach($files as $file){
    mysql_query("LOAD DATA INFILE '".$file."' INTO TABLE yourtable");
}

Veja o Manual do MySQL para LOAD DATA INFILE opções que se ajustam aos seus documentos.

11
konsolenfreddy

Você pode usar um script do Shell para percorrer os arquivos (este assume que eles estão no diretório atual):

#!/bin/bash

for f in *.csv
do
    mysql -e "load data infile '"$f"' into table my_table" -u username --password=your_password my_database
done
4
Tom H

Para Windows, use este lote

echo off
setlocal enabledelayedexpansion
FOR %%f IN ("*.csv") DO (
  set old=%%~dpnxf
  set new=!old:\=\\!
  mysql -e "load data local infile '"!new!"' IGNORE into table email_us.business  COLUMNS TERMINATED BY ','" -u root
  echo %%~nxf DONE
)
  • email_us -> DB
  • negócios -> mesa
  • IGNORAR -> Ignorar inserção duplicada e, em caso de erro, continuar continuar
  • ~ dpnxf -> d para letra da unidade, p para caminho do arquivo, n para nome do arquivo, x para extensão ef é variável de arquivo

Etapas: - Coloque esse arquivo em lotes no diretório em que existem vários arquivos csv e o nomeie como algo.bat - execute o cmd.exe como administrador e chame esse arquivo algo.bat e aproveite a importação ...

2
Wasim A.

Modifiquei o script de Tom para resolver alguns problemas enfrentados

#!/bin/bash

for f in *.csv
do
    mysql -e "load data local infile '"$f"' into table myTable fields TERMINATED BY ',' LINES TERMINATED BY '\n'"  -u myUser--password=myPassword fmeter --local-infile
done
  1. load data local infile ao invés de load data infile: [o arquivo a ser carregado era local no servidor mysql]
  2. Adicionadas opções de delimitador para combinar com meus dados.
  3. --local-infile para ativar o modo de carregamento de dados local no cliente.
2
Abhijeet Apsunde

Usando o seguinte script do Shell:

for file in /directory/*.csv
do
echo "Importing file $file"
       chown mysql $file
        mysql Fortinet -u user -p'password' <<EOF

LOAD DATA LOCAL INFILE '$file'
IGNORE
INTO TABLE tablename
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
EOF

echo "Completed importing '"$file"' "

done
0
Harkeet Bajaj

@hlosukwakha você quer usar mysqlimport. isso procura por uma tabela chamada como o arquivo. usar mysqlimport -help para encontrar os parâmetros corretos, mas eles são basicamente idênticos a mysql

0
Oskar Must

eu tive a mesma tarefa de fazer com muitos arquivos CSV e criar uma tabela por CSV, então aqui está o meu script que eu uso localmente no XAMP.

<?php
ini_set('display_errors',1);
echo '### Begin Importation<br>';

$mysqli  =  new mysqli(
"localhost",
"root",
"",
"mydatabase",
3306
);

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$files = glob('C:\\xampp\\mysql\\data\\mev2\\*.csv');

foreach($files as $file){

    //clean names if needed
    $filename = explode('\\',$file);
    $filename2clean = str_replace('.csv','', $filename[5]);//because my file is under 5 folders on my PC
    $n = strtolower(str_replace('fileprefix_','', filename2clean));

    echo '<br>Create table <b>'.$n.'</b><hr>';

    $sql = "CREATE TABLE IF NOT EXISTS `mydatabase`.`".$n."` (`email` varchar(60), `lastname` varchar(60), `firstname` varchar(60), `country` varchar(19)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";

    if (!($stmt = $mysqli->query($sql))) {
        echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;
    };

    echo '<br>Import data from <b>'.$n.'</b><hr>';

    $sql = "LOAD DATA INFILE '".basename($file)."' INTO TABLE `mydatabase`.`".$n."`  
        FIELDS TERMINATED BY ';'
        LINES TERMINATED BY '\r'  
        IGNORE 1 LINES";

    if (!($stmt = $mysqli->query($sql))) {
        echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;
    };

}

echo '### Import finished !<br>';
0
Melvita

Em python você pode usar d6tstack o que torna isso simples

import d6tstack
import glob

c = d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'))
c.to_mysql_combine('mysql+mysqlconnector://usr:[email protected]/db', 'tablename')

Ele também lida com alterações no esquema de dados , cria tabela e permite que você pré-processe dados.

0
citynorman