如何导入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; 

但仍然有很多完全NULLlogging,并没有被加载的数据似乎是在正确的地方。

问题的核心似乎是将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数据 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导入。 这里是步骤:

  1. 准备CSV文件以使其字段与MySQL表字段的顺序相同。

  2. 从CSV中删除标题行(如果有),以便只有数据在文件中。

  3. 转到phpMyAdmin界面。

  4. 在左侧菜单中select表格。

  5. 点击顶部的导入button。

  6. 浏览到CSV文件。

  7. select“使用加载数据的CSV”选项。

  8. 在“终止的字段”中input“,”。

  9. 按照与数据库表中相同的顺序input列名。

  10. 点击开始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);

如果大数据,你可以喝咖啡,并加载!

这就是你所需要的。