如何将CSV文件导入到MySQL表中?

问题描述 投票:293回答:18

我有一个试图从客户端加载到MySQL表中的非标准化事件日志CSV,以便可以将其重构为合理的格式。我创建了一个名为“ 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正在解析文件,好像每一行都对应于一个databazse行。我可以毫无问题地将文件加载到OpenOffice中。

clientdata.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;

但是仍然有很多完全NULL记录,而且似乎没有加载的数据都在正确的位置。

mysql csv load-data-infile
18个回答
130
投票

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

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

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

Import textfile

Screenshot: "Import textfile" dialog

要打开导入文本文件”对话框,请转到Tools > Import CSV file

enter image description here


4
投票

我看到一些奇怪的东西。您要为ESCAPING使用与ENCLOSING相同的字符。因此,引擎在找到“''”时不知道该怎么办,我认为这就是为什么似乎没有正确的地方的原因。我认为,如果删除ESCAPING行,应该运行得很好。喜欢:


4
投票

如何将csv文件导入sql表


2
投票

还有另一个解决方案是使用令人惊叹的csvsql套件中的csvkit工具。


1
投票

如果您使用的是装有Excel电子表格的Windows计算机,则Excel的新mySql插件非常出色。 Oracle的员工确实在该软件上做得很好。您可以直接从Excel建立数据库连接。该插件将分析您的数据,并以与数据一致的格式为您设置表格。我有一些要转换的巨型CSV文件数据。该工具可节省大量时间。


1
投票

这里是示例excel文件的屏幕截图:


1
投票

我使用mysql工作台完成相同的工作。


0
投票

将CSV文件导入到MySQL数据库的PHP查询


0
投票

更改服务器名,用户名,密码,dbname,文件路径,表名和要插入的数据库中的字段



188
投票

使用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'


80
投票

我已导入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

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


65
投票

我知道问题很旧,但是我想分享这个

我使用此方法在0.046sec中导入了超过100K条记录(〜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

这是如果文件有标题行的样子。

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);

28
投票

phpMyAdmin可以处理CSV导入。步骤如下:

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

  2. 从CSV中删除标题行(如果有的话),因此只有数据在文件中。

  3. 转到phpMyAdmin界面。

  4. 选择左侧菜单中的表格。

  5. 单击顶部的导入按钮。

  6. 浏览到CSV文件。

  7. 选择选项“使用LOAD DATA的CSV”。

  8. 在“以...结尾的字段中输入”,”。

  9. 以与数据库表中相同的顺序输入列名。

  10. 单击“执行”按钮,就完成了。

这是我准备将来使用的说明,如果其他人可以从中受益,请在这里分享。


12
投票

您可以通过列出LOAD DATA语句中的列来解决此问题。从manual

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

...因此,在您的情况下,您需要按其在csv文件中的显示顺序列出99列。


7
投票

mysql命令行在导入时容易出现太多问题。这是您的操作方法:

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

7
投票

尝试一下,它对我有用

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

IGNORE 1 ROWS在这里忽略包含字段名称的第一行。请注意,对于文件名,您必须输入文件的绝对路径。


4
投票

如果使用的是MySQL Workbench(当前为6.3版),则可以通过以下方式进行此操作:

  1. 右键单击“表”;
  2. 选择表数据导入向导;
  3. 选择您的csv文件并按照说明进行操作(也可以使用JSON);好处是,您可以基于要导入的csv文件创建新表或将数据加载到现有表中]
  4. enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.