我有一个来自客户端的非规范化事件日记CSV,我试图将其加载到MySQL表中,以便我可以重构成一个正常的格式。我创建了一个名为“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);

表上没有约束,所有字段都包含VARCHAR(256)值,除了包含计数(用INT表示)、是/否(用BIT表示)、价格(用DECIMAL表示)和文本介绍(用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填充。

我认为问题在于文本简介包含多行,MySQL解析文件时就好像每个新行对应一个数据库行一样。我可以毫无问题地将文件加载到OpenOffice中。

csv文件包含2593行和570条记录。第一行包含列名。我认为它是用逗号分隔的,文本显然是用双引号分隔的。

更新:

如果有疑问,请阅读手册:http://dev.mysql.com/doc/refman/5.0/en/load-data.html

我在LOAD DATA语句中添加了一些OpenOffice智能推断的信息,现在它加载了正确数量的记录:

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;

但是仍然有很多完全为空的记录,没有一个数据被加载似乎在正确的地方。


当前回答

我知道我的回答有点晚了,但我想提一些其他的方法。 最简单的方法是使用命令行。具体步骤如下:

以如下命令进入MySQL命令行:

Mysql -u my_user_name -p

在数据库中创建一个表

使用new_schema; 创建表employee_details ( id的整数, employee_name VARCHAR (100), employee_age整数, 主键(id) );

导入CSV文件到表格中。我们可以指定文件路径,也可以将文件存储在MySQL服务器的默认目录中。

LOAD DATA INFILE“导出csv文件的路径” INTO TABLE employee_details 以','结尾的字段 忽略1行;

这是众多解决方案中的唯一一个,我在本教程中找到了它 如果将CSV文件加载到MySQL数据库是你的日常任务,那么最好将这个过程自动化。在这种情况下,您可以使用一些第三方工具,允许您在计划中加载数据。

其他回答

问题的核心似乎是将CSV文件中的列与表中的列进行匹配。

许多图形化mySQL客户端都有非常好的导入对话框。

我最喜欢的工作是基于Windows的HeidiSQL。它为您提供了一个图形界面来构建LOAD DATA命令;您可以稍后以编程方式重用它。

截图:“导入文本文件”对话框

打开“导入文本文件”对话框,进入工具>导入CSV文件:

mysql命令行在导入时容易出现太多问题。你可以这样做:

使用excel编辑标题名称,使其没有空格 另存为。csv 使用免费的Navicat Lite Sql浏览器导入并自动创建一个新表(给它一个名字) 打开新表,为ID插入一个主要的汽车编号列 根据需要更改列的类型。 完成了!

当执行MySQL查询导入CSV时,我得到了错误 错误代码:1290。MySQL服务器使用——secure-file-priv选项运行,因此无法执行此语句。

所以我把文件移到安全文件位置

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Orders.csv'   
INTO TABLE orderdetails.orders 
FIELDS TERMINATED BY ','  
 ENCLOSED BY '"'
 LINES TERMINATED BY '\n'
 IGNORE 1 ROWS

文件的位置是“C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Orders.csv”,这是因为,我将我的CSV文件移动到“secure_file_priv”位置,否则我就会得到上面的错误

你可以通过查询SHOW VARIABLES LIKE "secure_file_priv"来获得你的secure_file_priv;

来源:导入CSV文件到MySQL(查询或使用Workbench)

可以通过在LOAD DATA语句中列出列来解决这个问题。摘自手册:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

...因此,在您的情况下,您需要按照它们在CSV文件中出现的顺序列出99列。

最简单的方法,我已经导入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

记住一件事,永远不要出现在第二列,否则导入将停止