如何将CSV文件导入MySQL表

时间:2010-09-03 11:10:55

标签: 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);

表上没有约束,并且所有字段都包含VARCHAR(256)值,但包含计数(由INT表示),是/否(由BIT表示),价格(由DECIMAL表示)和text 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               | 
...

整个表格中填充了NULL

我认为问题是文本blurbs包含多行,而MySQL正在解析文件,好像每个新行都对应一个数据行。我可以毫无问题地将文件加载到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记录,并且没有任何加载的数据似乎都在正确的位置。

20 个答案:

答案 0 :(得分:176)

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

答案 1 :(得分:119)

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

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

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

Import textfile

Screenshot: "Import textfile" dialog

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

enter image description here

答案 2 :(得分:75)

我导入200多行的最简单方法是在phpmyadmin sql window

中的命令下面

我有一个简单的国家表,有两列 CountryId,国家或地区名称

这里是.csv数据CSV FILE

这是命令:

LOAD DATA INFILE 'c:/country.csv' 
INTO TABLE country 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

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

答案 3 :(得分:58)

  

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

我使用此方法在 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);

答案 4 :(得分:25)

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

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

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

  3. 转到phpMyAdmin界面。

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

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

  6. 浏览到CSV文件。

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

  8. 在“以...终止的字段”中输入“,”。

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

  10. 点击“转到”按钮即可完成。

  11. 这是我为将来的使用做好准备的一个注释,如果其他人可以从中受益,请在这里分享。

答案 5 :(得分:11)

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

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

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

答案 6 :(得分:7)

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

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

答案 7 :(得分:6)

试试这个,它对我有用

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

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

答案 8 :(得分:4)

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

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

答案 9 :(得分:3)

如何将csv文件导入sql表

#Example file:
Overseas_trade_index data CSV File:
Steps:

1.Need to create table for overseas_trade_index.

2.Need to create columns related to csv file.
#SQL Query:
( id int not null primary key auto_increment,
series_reference varchar (60),
period varchar (60),
data_value decimal(60,0),
status varchar (60),
units varchar (60),
magnitude int(60),
subject text(60),
group text(60),
series_title_1 varchar (60),
series_title_2 varchar (60),
series_title_3 varchar (60),
series_title_4 varchar (60),
series_title_5 varchar (60),
 );

3.Need to connect mysql database in terminal.
=>show databases;
=>use database;
=>show tables;

#Please enter this command to import the csv data to mysql tables.

#load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);#

=>Find this overseas trade index data on sqldatabase:
#Query:
select * from trade_index;

答案 10 :(得分:3)

我看到一些奇怪的东西。您要为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;

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

答案 11 :(得分:2)

您还可以尝试使用此在线工具,根据您的CSV生成SQL创建/插入语句。 http://www.convertcsvtomysql.com/

我喜欢这个工具:

  • 简单
  • 它不仅生成INSERT语句,还生成CREATE语句 生成一个表
  • 生成CREATE语句时,此工具不仅会使所有字段为VARCHAR - 它会分析CSV中的数据,并根据该分析选择正确的数据类型。

缺点

  • 输入文件大小限制为3mb
  • 您可能不愿意将您的数据泄露给某些第三方

答案 12 :(得分:2)

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

用法示例:

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

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

要安装套件

pip install csvkit

先决条件: python-devlibmysqlclient-devMySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python

答案 13 :(得分:1)

以下是示例excel文件屏幕截图:

enter image description here

另存为,然后选择.csv。

如果您使用记事本++或任何其他记事本打开,您将拥有如下所示.csv数据屏幕截图。

enter image description here

确保删除标题并在.csv中进行列对齐,如同在mysql表中一样。 用文件夹名称替换folder_name

LOAD DATA LOCAL INFILE
' d:/folder_name/myfilename.csv' INTO TABLE邮件 FIELDS终止于',' (fname,lname,email,phone);

如果是大数据,你可以拿咖啡加载!。

这就是你需要的一切。

答案 14 :(得分:1)

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

  1. 创建新架构
  2. 打开新创建的架构
  3. 右键单击“表”,然后选择“表数据导入向导”
  4. 提供csv文件路径和表名,最后配置您的列类型,因为向导会根据它们的值设置默认列类型。

注意:通过使用“ tail -f [mysqlworkbenchpath] /log/wb*.log”来查看mysql工作台的日志文件中是否有任何错误

答案 15 :(得分:1)

  

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

<?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>'
       }
    ?>

答案 16 :(得分:1)

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

答案 17 :(得分:1)

如果您使用的是装有Excel电子表格的Windows机器,那么Excel的新mySql插件就非常出色。 Oracle的员工在该软件上做得非常好。您可以直接从Excel建立数据库连接。该插件将分析您的数据,并以与数据一致的格式为您设置表格。我有一些怪物大的csv数据文件要转换。这个工具节省了大量时间。

http://dev.mysql.com/downloads/windows/excel/

您可以在Excel中进行更新,这些更新将在线填充到数据库中。这对于在超便宜的GoDaddy共享主机上创建的mySql文件非常有效。 (注意在GoDaddy上创建表时,您必须选择一些非标准设置来启用数据库的非现场访问...)

使用此插件,您可以在XL电子表格和在线mySql数据存储之间实现纯粹的交互。

答案 18 :(得分:0)

答案 19 :(得分:0)

我使用phpmyadmin以简单的方式做到了。我按照@Farhan的步骤进行操作,但是所有数据都放在同一列中。 我的工作方式:

  1. 创建了CSV文件,并删除了带有列名的标题行。仅保留数据。
  2. 我创建了一个表,其列名与csv列匹配。
  3. 记住要为每列分配适当的类型。
  4. 我刚刚选择了导入,然后转到了“导入”标签。
  5. 在浏览器中,我选择了CSV文件,并保留了所有选项。
  6. 令我惊讶的是,所有数据都已成功导入到其相应列中。