通过命令行将csv导入mysql
Posted
技术标签:
【中文标题】通过命令行将csv导入mysql【英文标题】:Importing a csv into mysql via command line 【发布时间】:2011-09-30 03:36:49 【问题描述】:我正在尝试将一个非常大的 .csv 文件 (~4gb) 导入 mysql。我正在考虑使用 phpmyadmin,但是您的最大上传大小为 2mb。有人告诉我,我必须使用命令行。
我打算使用这些说明来导入它:http://dev.mysql.com/doc/refman/5.0/en/mysqlimport.html#c5680
将 .csv 表中的第一行设置为 mysql 表中的列名的命令是什么?此选项可通过 phpmyadmin 获得,因此它们也必须是 mysql 命令行版本,对吧?请帮我。谢谢。
-拉吉
【问题讨论】:
【参考方案1】:大多数答案都遗漏了一个重点,例如如果您在 windows 上创建了从 Microsoft Excel 导出的 csv
文件并在 linux 环境中导入相同的文件,您会得到意想不到的结果。
正确的语法应该是
load data local infile 'file.csv' into table table fields terminated by ',' enclosed by '"' lines terminated by '\r\n'
这里的区别是'\r\n'
而不是简单的'\n
【讨论】:
【参考方案2】:我知道这说的是命令行,但只是一些快速尝试可能有用的东西,如果你有 MySQL 工作台并且 csv 不是太大,你可以简单地
SELECT * FROM 表 复制整个 CSV 将 csv 粘贴到 Workbench 的查询结果部分 希望一切顺利我说希望最好,因为这是 MySQL Workbench。你永远不知道它什么时候会爆炸
如果你想在远程服务器上这样做,你会这样做
mysql -h<server|ip> -u<username> -p --local-infile bark -e "LOAD DATA LOCAL INFILE '<filename.csv>' INTO TABLE <table> FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'"
注意,我没有在-p
之后输入密码,因为在命令行中输入密码被认为是不好的做法
【讨论】:
【参考方案3】:另一种选择是使用 csvkit 库中的 csvsql 命令。
直接在命令行上的示例用法:
csvsql --db mysql:///test --tables yourtable --insert yourfile.csv
如果您需要对多个文件执行此操作,可以直接在命令行上执行,或者内置到 python 或 shell 脚本中以实现自动化。
csvsql 允许您根据 csv 的结构动态创建数据库表,因此它是一种将 csv 的第一行自动转换为 MySQL 表头的精简代码方式。
此处的完整文档和更多示例: https://csvkit.readthedocs.io/en/1.0.3/scripts/csvsql.html
【讨论】:
【参考方案4】:你可以简单地导入
mysqlimport --ignore-lines=1 --lines-terminated-by='\n' --fields-terminated-by=',' --fields-enclosed-by='"' --verbose --local -uroot -proot db_name csv_import.csv
注意:Csv 文件名和表名应该相同
【讨论】:
【参考方案5】:你可以这样写:
LOAD DATA LOCAL INFILE 'C:/Users/userName/Downloads/tableName.csv'
INTO TABLE tableName
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
【讨论】:
此答案与the answer provided 7 years earlier 完全相同。 不太一样,它从 Windows 机器上的特定位置加载文件,并且没有enclosed by '"'
。
ERROR 1290 (HY000): MySQL 服务器使用 --secure-file-priv 选项运行,因此无法执行此语句 - 无效【参考方案6】:
你可以做一个
mysqlimport --columns='head -n 1 $yourfile' --ignore-lines=1 dbname $yourfile`
也就是说,如果您的文件是逗号分隔且不是分号分隔的。否则,您可能还需要通过它sed
。
【讨论】:
表格是否必须已经创建并带有标题?$yourfile
是什么格式,*.csv 可以工作吗?
您的导入文件需要标题,'head -n 1 $yourfile' 返回 CSV 文件的第一个逗号分隔行。 --ignore-lines=1 然后忽略那一行,因为它会尝试将这些插入到您的表中。默认分隔符是制表符 (\t),因此还要添加一个 --fields-terminated-by=','
子句来使用逗号分隔符。请阅读linux.die.net/man/1/mysqlimport和dev.mysql.com/doc/refman/5.7/en/load-data.html
不应该是:`mysqlimport --columns=$(head -n 1 FILE) --ignore-lines=1 dbname FILE 其中file是数据库文件吗?使用 --columns='head -n 1 $yourfile' 会产生语法错误。此外,您可能必须添加选项 --local 因为许多 mysql 服务器默认由 --secure-file-priv 选项配置。
--columns='head -n 1 $yourfile'
引发语法错误。 --columns=$(head -n 1 FILE)
工作【参考方案7】:
试试这个:
mysql -uusername -ppassword --local-infile scrapping -e "LOAD DATA LOCAL INFILE 'CSVname.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'"
【讨论】:
【参考方案8】:试试这个命令
load data local infile 'file.csv' into table table
fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(column1, column2, column3,...)
此处的字段是数据需要放在其中的实际表字段。括起来的行和终止的行是可选的,如果您有用双引号括起来的列(例如 Excel 导出等),则可以提供帮助。
更多详情请查看manual。
对于将第一行设置为表列名,只需忽略该行而不被读取并在命令中添加值。
【讨论】:
几个问题,首先,column1,column2等是否需要在其周围加上引号?我的问题是它们是我需要导入的大约 50 多个列名。第一行包含所有数据,所以如果有某种方法可以让 mysql 读取第一行,并将它们设置为列名,那将是最好的。一个一个地写每个名字太乏味了。谢谢。 你不需要写,看到列名是逗号分隔的,所以只需从你的csv文件中剪切第一行并将其粘贴到命令中,据我所知,在phpMyAdmin中,首先读取 csv 以生成这样的查询,然后完成导入。 嗯,没想到。让我试一试。谢谢你。您是否知道如何从文本编辑器复制并粘贴到 ubuntu 终端? 要么右键单击,你会得到一个选项粘贴,或使用Ctrl+Shift+V
好的,那我需要把4gb的文件上传到服务器上试试。感谢您的帮助!【参考方案9】:
对于使用 mysqlimport 导入带有标题行的 csv,只需添加
--ignore-lines=N
(忽略数据文件的前N行)
您链接的页面中描述了此选项。
【讨论】:
我不想忽略第一行。我想将第一行用作列标题。 您不能使用 mysqlimport 执行此操作,但您可以添加选项 --columns=column_list 为命令提供表中 csv 字段的顺序。以上是关于通过命令行将csv导入mysql的主要内容,如果未能解决你的问题,请参考以下文章
MariaDB vs Mysql 通过命令行导入macosx