如何将多个csv文件导入MySQL数据库

时间:2011-12-16 19:11:14

标签: mysql import phpmyadmin

有没有办法将多个csv文件同时导入MySQL数据库?某种批量导入?

我在Mac OSX上运行MAMP服务器。

我有185个csv文件需要导入MySQL表。我可以使用phpMyAdmin的导入选项卡单独导入它们,但这需要很长时间。有谁知道是否有更好的方法?

10 个答案:

答案 0 :(得分:12)

使用像这样的shell脚本:

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

答案 1 :(得分:8)

您可以使用一些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手册,了解适合您文档的LOAD DATA INFILE选项。

答案 2 :(得分:3)

您可以使用shell脚本循环遍历文件(这假设它们位于当前目录中):

#!/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

答案 3 :(得分:2)

我修改了Tom的脚本以解决面临的几个问题

#!/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在客户端启用本地数据加载模式。

答案 4 :(得分:1)

对于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 - &gt; DB
  • 业务 - &gt;表
  • IGNORE - &gt;忽略重复插入并在出错时继续
  • ~dpnxf - &gt;驱动器号为d,路径为p 要归档,n表示文件名,x表示扩展名,f是文件变量

步骤:   - 将该批处理文件放在存在所有多个csv文件的目录中,并将其命名为something.bat   - 运行cmd.exe作为管理员并调用something.bat文件并享受导入...

答案 5 :(得分:0)

@hlosukwakha你想使用mysqlimport。 这会搜索名为该文件的表。 使用mysqlimport -help查找正确的参数,但它们与mysql

基本相同

答案 6 :(得分:0)

在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')

它还处理data schema changes,创建表并允许您预处理数据。

答案 7 :(得分:0)

我要处理大量CSV文件并通过CSV创建一个表的任务相同,所以这是我在XAMP下在本地使用的脚本。

#ENABLE_WINMD_SUPPORT

答案 8 :(得分:0)

使用以下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

答案 9 :(得分:0)

我像@citynorman 一样使用 Python 和 d6tstack,但因为我在 200 个 CSV 文件中有 2400 万行,这种方法正在扼杀我的开发数据库服务器。

这种方法在 2 或 3 行代码中为您提供了大量控制和性能。它在大约 2 分钟内将 2400 万行提取到一个五索引列的 MySQL 表中,并添加了数据清理。 MySQL Workbench 上的 csv 导入工具需要几天时间才能完成同样的事情。

这是我所做的工作:

import pandas as pd
import importlib
import d6tstack.combine_csv as d6tc
import d6tstack
import glob
import pymysql  # This approach also supports other MySQL connectors
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://usr:pass@host:3306/db")

# For testing just pull in one or two csv files - and then take all
# My data had a ; semicolon separator, so change this to your use case if needed
df = d6tc.CombinerCSV(glob.glob('C:/Users/user/Downloads/csvfiles/*.csv'), sep=';').to_pandas()

# Remove Filepath and Filename 
df.drop(columns=["filepath","filename"],inplace=True, axis=1)

# I created Indexes in my database file during testing, so this line
# makes sure there are no null index values in the CSVs
df = df[df['country'].notna()]

# chunksize throttles your database updates so as not to overwhelm any buffers
# NEVER use "if_exists=replace", unless you want to blank your table 100%
df.to_sql(name='table', con=engine, if_exists='append', index=False, chunksize=200)