如何将CSV文件导入MySQL表

Iai*_*der 284 mysql csv load-data-infile

我有一个来自客户端的非标准化事件日记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);
Run Code Online (Sandbox Code Playgroud)

表中没有约束,并且所有字段都包含VARCHAR(256)值,但包含计数(由INT表示),是/否(由BIT表示),价格(由DECIMAL表示)和文本blurbs(由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               | 
...
Run Code Online (Sandbox Code Playgroud)

整张桌子都装满了NULL.

我认为问题是文本blurbs包含多行,而MySQL正在解析文件,好像每个新行都对应一个数据行.我可以毫无问题地将文件加载到OpenOffice中.

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

更新:

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

我在LOAD DATAOpenOffice足够智能推断的声明中添加了一些信息,现在它加载了正确数量的记录:

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;
Run Code Online (Sandbox Code Playgroud)

但仍然有很多完整的NULL记录,并没有任何加载的数据似乎是在正确的地方.

mic*_*ber 181

使用mysqlimport将表加载到数据库中:

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv
Run Code Online (Sandbox Code Playgroud)

我在http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/找到了它

要使分隔符成为选项卡,请使用 --fields-terminated-by='\t'

  • 与`LOAD DATA INFILE`一样,您需要先创建一个表,然后才能使用`mysqlimport`. (8认同)
  • `mysqlimport`在幕后使用`LOAD DATA INFILE ...`,所以它几乎是一样的. (6认同)

Pek*_*ica 125

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

许多图形化的mySQL客户端都有很好的导入对话框.

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

导入文本文件

屏幕截图:"导入文本文件"对话框

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

在此输入图像描述

  • 对于Mac OSX,请使用Sequel Pro. (25认同)
  • 我只是尝试了它,它要求我先创建表...而不是使用列名. (3认同)
  • 您必须先选择一个表才能继续...并且因为整点不必制作表... (3认同)
  • 请注意,在Linux中,HeidiSQL在Wine下运行良好. (2认同)

Dar*_*vil 79

我导入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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果它是本地文件,您可能需要`LOAD DATA LOCAL INFILE`.如果抛出错误1148"不允许使用命令",则可以通过命令行使用`--local-infile`运行mysql来启用它. (16认同)
  • 我收到此错误:MySQL 服务器正在使用 --secure-file-priv 选项运行,因此无法执行此语句 (2认同)

Fah*_*had 63

我知道这个问题已经过时了,但我想分享一下

我使用此方法在0.046秒内导入超过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);
Run Code Online (Sandbox Code Playgroud)

包含最后一行非常重要,如果你有多个字段,即通常它会跳过最后一个字段(MySQL 5.6.17)

LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);
Run Code Online (Sandbox Code Playgroud)

然后,假设您将第一行作为字段的标题,您可能还希望包含此行

IGNORE 1 ROWS
Run Code Online (Sandbox Code Playgroud)

如果您的文件有标题行,这就是它的样子.

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);
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的解决方案。对于任何好奇这有多快的人来说:我在 20 美元/月的 AWS Lightsail 实例上使用板载 MySQL 服务器(不是高性能 RDS)在 14 秒内导入了 320 万行。惊人的! (2认同)

Far*_*han 26

phpMyAdmin可以处理CSV导入.以下是步骤:

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

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

  3. 转到phpMyAdmin界面.

  4. 在左侧菜单中选择表格.

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

  6. 浏览到CSV文件.

  7. 选择"使用LOAD DATA的CSV"选项.

  8. 在"终止于的字段"中输入",".

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

  10. 单击"开始"按钮,您就完成了.

这是我为未来使用做好准备的一个注释,如果其他人可以受益,我会在这里分享.


小智 12

如果您使用的是 MySQL Workbench(目前为 6.3 版本),您可以通过以下方式执行此操作:

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

在此处输入图片说明


laf*_*cow 11

您可以通过列出LOAD DATA语句中的列来解决此问题.从手册:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
Run Code Online (Sandbox Code Playgroud)

...所以在您的情况下,您需要按照它们在csv文件中出现的顺序列出99列.


小智 7

mysql命令行在导入时容易出现太多问题.这是你如何做到的:

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


Dav*_*vid 6

试试这个,它对我有用

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;
Run Code Online (Sandbox Code Playgroud)

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


ruv*_*vim 5

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

\n\n

使用示例:

\n\n
csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file\n
Run Code Online (Sandbox Code Playgroud)\n\n

该工具可以自动推断数据类型(默认行为)、创建表并将数据插入到创建的表中。--overwrite如果表已经存在,则可以使用选项删除表。--insert选项 \xe2\x80\x94 从文件填充表。

\n\n

安装套件

\n\n
pip install csvkit\n
Run Code Online (Sandbox Code Playgroud)\n\n

先决条件: python-dev , libmysqlclient-dev,MySQL-python

\n\n
apt-get install python-dev libmysqlclient-dev\npip install MySQL-python\n
Run Code Online (Sandbox Code Playgroud)\n


小智 5

我看到一些奇怪的东西。您用于 ESCAPING 的字符与用于 ENCLOSING 的字符相同。所以当引擎发现一个 '"' 时,它不知道该怎么做,我认为这就是为什么似乎没有什么东西在正确的地方。我认为如果你删除 ESCAPING 的行,应该运行得很好。比如:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
Run Code Online (Sandbox Code Playgroud)

除非您分析(手动,视觉,...)您的 CSV 并找到哪个字符用于转义。有时是“\”。但是,如果您没有它,请不要使用它。