从带有标题的CSV文件创建表


12

我正在寻找一种仅基于指定CSV内容生成新MySQL表的方法。我将使用的CSV文件具有以下属性;

  • “ |” 定界的。
  • 第一行指定列名称(标题),也为“ |” 定界的。
  • 列名和顺序不固定。
  • 列数不固定。
  • 文件很大(100万行/ 50列)。

在Excel中,这非常简单,但是对于MySQL来说似乎并非如此(谷歌不走运)。对我应该看的东西有什么建议吗?

Answers:


10

您可以使用csvsql,它是csvkit(用于转换为CSV文件并使用CSV文件的一组实用程序)的一部分:

  • Linux或Mac OS X
  • 免费和开源
  • sudo pip install csvkit
  • 例: csvsql --dialect mysql --snifflimit 100000 datatwithheaders.csv > mytabledef.sql
  • CREATE TABLE基于文件内容创建一个语句。列名取自CSV文件的第一行。

2

如果您可以使用Python,Pandas对我来说效果很好(csvsql永久挂起,cols和行数比您的情况少)。就像是:

from sqlalchemy import create_engine
import pandas as pd

df = pd.read_csv('/PATH/TO/FILE.csv', sep='|')
# Optional, set your indexes to get Primary Keys
df = df.set_index(['COL A', 'COL B'])

engine = create_engine('mysql://user:pass@host/db', echo=False)

df.to_sql(table_name, engine, index=False)

您在哪里定义dwh_engine?这是拼写错误engine吗?
joanolo

是的,应该engine!更正了答案,感谢您发现
-ivansabik

如果行数很多,to_sql将花费太多时间。对于我们来说,大约36000行花费了大约90分钟。在3秒内完成了直接加载语句。
mvinayakam '18

0

您需要根据各个列的数据类型,大小等生成一个CREATE TABLE。

然后,使用LOAD DATA INFILE ...以'|'终止的字段 以“ \ n”跳过的行1行...; (有关详细信息,请参见手册页。)

对每个csv->表也同样如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.