如何导入CSV文件到MySQL表
我有一个来自客户端的非标准事件日志CSV,我试图加载到MySQL表中,以便我可以重构成一个理智的格式。 我创build了一个名为“CSVImport”的表格,其中CSV文件的每一列都有一个字段。 CSV包含99列,所以这本身就是一项艰巨的任务:
CREATE TABLE 'CSVImport' (id INT); ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256); ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256); ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256); ... ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256); ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);
除了包含计数(由INT表示),是/否(由BIT表示),价格(由DECIMAL表示)以及文本模糊(除非另有说明)的列以外,所有字段都保存VARCHAR(256)由TEXT表示)。
我试图加载数据到文件中:
LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport; Query OK, 2023 rows affected, 65535 warnings (0.08 sec) Records: 2023 Deleted: 0 Skipped: 0 Warnings: 198256 SELECT * FROM CSVImport; | NULL | NULL | NULL | NULL | NULL | ...
整个表都填充NULL
。
我认为问题在于文本blurb包含多行,MySQL正在parsing文件,就好像每个新行将对应一个databazse行一样。 我可以加载文件到OpenOffice没有问题。
clientdata.csv文件包含2593行和570条logging。 第一行包含列名称。 我认为这是逗号分隔,文本显然是用双引号分隔。
更新:
如有疑问,请阅读手册: http : //dev.mysql.com/doc/refman/5.0/en/load-data.html
我在LOAD DATA
语句中添加了一些信息,即OpenOffice足够聪明地推断,现在它载入正确数量的logging:
LOAD DATA INFILE "/home/paul/clientdata.csv" INTO TABLE CSVImport COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;
但仍然有很多完全NULL
logging,并没有被加载的数据似乎是在正确的地方。
问题的核心似乎是将CSV文件中的列与表中的列匹配。
许多graphics化的mySQL客户端都有非常好的导入对话框。
我最喜欢的工作是基于Windows的HeidiSQL 。 它给你一个graphics界面来build立LOAD DATA
命令; 您可以稍后以编程方式重新使用它。
屏幕截图:“导入文本文件”对话框
要打开导入文本文件“对话框,请转至Tools > Import CSV file
:
使用mysqlimport将表加载到数据库中:
mysqlimport --ignore-lines=1 \ --fields-terminated-by=, \ --local -u root \ -p Database \ TableName.csv
我发现它在http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/
要使分隔符成为制表符,请使用--fields-terminated-by='\t'
我导入了200多行的最简单的方法是在phpmyadmin的SQL窗口下面的命令
我有一个简单的国家两列CountryId,CountryName表
这里是.csv数据
这里是命令:
LOAD DATA INFILE 'c:/country.csv' INTO TABLE country FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS
记住一件事,不要出现在第二栏,否则你的import将停止
下一次你需要做这样的事情,请尝试使用sqlizer.io 。 这是一个简单的在线工具,你可以上传你的CSV文件。 它将使用所有正确的types和一系列匹配创build表的INSERT语句来生成CREATE TABLE命令。
您只需要将文件types从Excel Spreadsheet更改为CSV文件:
phpMyAdmin可以处理CSV导入。 这里是步骤:
-
准备CSV文件以使其字段与MySQL表字段的顺序相同。
-
从CSV中删除标题行(如果有),以便只有数据在文件中。
-
转到phpMyAdmin界面。
-
在左侧菜单中select表格。
-
点击顶部的导入button。
-
浏览到CSV文件。
-
select“使用加载数据的CSV”选项。
-
在“终止的字段”中input“,”。
-
按照与数据库表中相同的顺序input列名。
-
点击开始button,你就完成了。
这是一个笔记,我准备为我的未来使用,并在这里分享,如果别人可以受益。
您可以通过列出LOAD DATA语句中的列来解决这个问题。 从手册 :
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
…所以在你的情况下,你需要按照它们出现在csv文件中的顺序列出99列。
mysql命令行在导入时很容易出现太多问题。 这是你如何做到的:
- 使用excel编辑标题名称以使其不含空格
- 保存为.csv
- 使用免费的Navicat Lite Sql Browser导入并自动创build一个新表(给它一个名字)
- 打开新表插入ID的主要自动编号列
- 根据需要更改列的types。
- 完成了!
我知道这个问题很老 ,但我想分享一下
我用这个方法在0.046秒内导入超过100K的logging( 〜5MB)
这是你怎么做的,
LOAD DATA LOCAL INFILE 'c:/temp/some-file.csv' INTO TABLE your_awesome_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (field_1,field_2 , field_3);
包含最后一行非常重要,如果您有多个字段,即通常会跳过最后一行(MySQL 5.6.17)
LINES TERMINATED BY '\n' (field_1,field_2 , field_3);
那么,无论如何,如果你有第一行作为领域的标题 ,你也可以包括这一行
IGNORE 1 ROWS;
你也可以尝试这个在线工具来根据你的CSV生成SQL创build/插入语句。 http://www.convertcsvtomysql.com/
我喜欢这个工具:
- 简单
- 它不仅生成INSERT语句,而且还生成CREATE语句来生成一个表
- 当生成CREATE语句时,这个工具不仅会生成所有的VARCHAR字段 – 它会分析CSV中的数据,并根据分析结果select合适的数据types。
缺点
- input文件大小限制为3MB
- 您可能不愿意将您的数据泄露给某些第三方
如果您正在使用装有Excel电子表格的Windows计算机,则Excel的新mySql插件是非常好的。 甲骨文的人真的在这个软件上做了很好的工作。 您可以直接从Excel中build立数据库连接。 该插件将分析您的数据,并以与数据一致的格式为您设置表格。 我有一些怪物的大csv文件的数据转换。 这个工具是一个很大的节省时间。
http://dev.mysql.com/downloads/windows/excel/
您可以在Excel中进行更新,以便在线填充到数据库。 这与超便宜的GoDaddy共享主机上创build的mySql文件非常好。 (注意,当你在GoDaddy上创build表时,你必须select一些非标准的设置来启用数据库的非现场访问…)
有了这个插件,您的XL电子表格和在线mySql数据存储之间就有了纯粹的交互性。
PHP查询导入csv文件到mysql数据库
$query = <<<EOF LOAD DATA LOCAL INFILE '$file' INTO TABLE users FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES (name,mobile,email) EOF; if (!$result = mysqli_query($this->db, $query)) { exit(mysqli_error($this->db)); }
**示例CSV文件数据**
name,mobile,email Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus Craig White,516-795-8065,CraigJWhite@inbound.plus David Whitney,713-214-3966,DavidCWhitney@inbound.plus
更改服务器名称,用户名,密码,dbname,文件path,表名以及数据库中要插入的字段
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "bd_dashboard"; //For create connection $conn = new mysqli($servername, $username, $password, $dbname); $query = "LOAD DATA LOCAL INFILE 'C:/Users/lenovo/Desktop/my_data.csv' INTO TABLE test_tab FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES (name,mob)"; if (!$result = mysqli_query($conn, $query)){ echo '<script>alert("Oops... Some Error occured.");</script>'; exit(); //exit(mysqli_error()); }else{ echo '<script>alert("Data Inserted Successfully.");</script>' } ?>
试试这个,它为我工作
LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;
IGNORE 1 ROWS忽略包含字段名称的第一行。 请注意,对于文件名,您必须键入文件的绝对path。
这里是示例excel文件的屏幕截图:
另存为并select.csv。
如果您使用记事本++或任何其他记事本打开,您将有如下所示的.csv数据屏幕截图。
确保你删除标题,并在.csv列alignment,如mysql表中。 用您的文件夹名称replacefolder_name
加载数据本地INFILE
'D:/folder_name/myfilename.csv'INTO TABLE邮件字段TERMINATED BY','(fname,lname,email,phone);
如果大数据,你可以喝咖啡,并加载!
这就是你所需要的。