有没有办法将多个csv文件同时导入MySQL数据库?某种批量导入?
我在Mac OSX上运行MAMP服务器。
我有185个csv文件需要导入MySQL表。我可以使用phpMyAdmin的导入选项卡单独导入它们,但这需要很长时间。有谁知道是否有更好的方法?
答案 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
load data local infile
而不是load data infile
:[要加载的文件是mysql服务器的本地文件] --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
)
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)