Как импортировать несколько файлов CSV в базу данных MySQL - PullRequest
11 голосов
/ 16 декабря 2011

Есть ли способ импортировать несколько файлов CSV одновременно в базу данных MySQL?Какой-то пакетный импорт?

Я на Mac OSX и использую сервер MAMP.

У меня есть 185 CSV-файлов, которые мне нужно импортировать в таблицу MySQL.Я могу импортировать их по отдельности, используя вкладку импорта phpMyAdmin, но это займет много времени.Кто-нибудь знает, есть ли лучший способ?

Ответы [ 9 ]

12 голосов
/ 16 декабря 2011

Используйте скрипт оболочки следующим образом:

#!/usr/bin/env bash
cd yourdirectory
for f in *.csv
do
        mysql -e "USE yourDatabase LOAD DATA LOCAL INFILE '"$f"'INTO TABLE yourtable"
done
9 голосов
/ 16 декабря 2011

Для вас есть небольшой PHP-скрипт:

#!/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");
}

См. Руководство по MySQL для НАГРУЗКА ИНФИЛЬНЫХ ДАННЫХ параметров, подходящих для ваших документов.

4 голосов
/ 16 декабря 2011

Вы можете использовать скрипт оболочки для циклического обхода файлов (предполагается, что они находятся в текущем каталоге):

#!/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
2 голосов
/ 10 августа 2013

Я изменил сценарий Тома, чтобы решить несколько проблем, с которыми столкнулся

#!/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 вместо load data infile: [загружаемый файл был локальным для сервера mysql]
  2. Добавлены разделители, чтобы соответствовать моим данным.
  3. --local-infile для включения режима локальной загрузки данных на клиенте.
1 голос
/ 11 апреля 2015

Для пользователей Windows используйте эту партию

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
  • бизнес -> Таблица
  • IGNORE -> Игнорировать повторяющуюся вставку и в случае ошибки продолжить
  • ~ dpnxf -> d для буквы диска, p для пути в файл, n для имени файла, x для расширения и f - переменная файла

Шаги: - Поместите этот пакетный файл в каталог, где существуют все несколько CSV-файлов, и назвали его как-то. - запустите cmd.exe в качестве администратора и вызовите этот файл нечто.bat и наслаждайтесь импортом ...

0 голосов
/ 30 мая 2019

Использование следующего сценария оболочки:

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 голосов
/ 27 марта 2019

У меня была та же задача, связанная с большим количеством CSV-файлов и созданием одной таблицы с помощью CSV, так что вот мой сценарий, который я использую в локальной среде под 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 голосов
/ 15 октября 2018

В Python вы можете использовать d6tstack , что делает это простым

import d6tstack
import glob

c = d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'))
c.to_mysql_combine('mysql+mysqlconnector://usr:pwd@localhost/db', 'tablename')

Он также обрабатывает изменения схемы данных , создает таблицу и позволяет предварительно обрабатывать данные.

0 голосов
/ 08 марта 2015

@ hlosukwakha вы хотите использовать mysqlimport. это ищет таблицу, названную как файл. используйте mysqlimport -help, чтобы найти правильные параметры, но они в основном идентичны mysql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...