将CSV文件直接导入MySQL

时间:2010-11-10 11:24:14

标签: php mysql csv import

我想将csv文件导入mysql ..类似于:

load data local infile 'uniq.csv' into table tblUniq
fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(uniqName, uniqCity, uniqComments)

http://www.tech-recipes.com/rx/2345/import_csv_file_directly_into_mysql/

但csv中的列名和数据库表中的列名不同,我该怎么办? 我想以编程方式进行..

6 个答案:

答案 0 :(得分:11)

  

但csv中的列名和数据库表中的列名不同,我该怎么做?

不是问题。您可以指定将哪个CSV列导入到哪个数据库列中。

LOAD DATA INFILE syntax

  

默认情况下,如果在LOAD DATA INFILE语句末尾没有提供列列表,则输入行应包含每个表列的字段。如果只想加载某些表的列,请指定列列表:

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

当我发现INFILE语法过于复杂时,我喜欢使用像HeidiSQL之类的图形客户端一起点击正确的列顺序(它有一个图形预览)并复制+粘贴生成的SQL查询。

答案 1 :(得分:3)

您可以创建一个脚本来解析csv文件并将数据放入db。

类似的东西:

    $path = "yourfile.csv";
    $row = 1;
    if (($handle = fopen($path, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $row++;
            $data_entries[] = $data ;

        }
        fclose($handle);
    }
    // this you'll have to expand
    foreach($data_entries as $line){
        $sql = "INSERT INTO ..."
        $db->execute($line);
    }

答案 2 :(得分:3)

如果您只想将CSV文件中最后一列的前7个字符加载到表格的uniqComments列中,那么您可以执行以下操作...

load data local infile 'uniq.csv' into table tblUniq fields terminated by ',' 
enclosed by '"' lines terminated by '\n' (uniqName, uniqCity, @seven_chars) 
set uniqComments=left(@seven_chars,7)

答案 3 :(得分:0)

试试这个,这对我来说很好。

ini_set('auto_detect_line_endings',TRUE);

$csv_data=array();

$file_handle = fopen($_FILES['file_name']['tmp_name'], 'r');

while(($data = fgetcsv($file_handle) ) !== FALSE){

 $update_data= array('first'=>$data['0'],
                      'second'=>$data['1'],
                      'third'=>$data['2'],
                       'fourth'=>$data['34']);

// save this array in your database
}

答案 4 :(得分:0)

以下语句将csv文件中的数据导入users表。

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

Import CSV file into MySQL

答案 5 :(得分:0)

我使用以下MySQL查询创建了表,

create table sales(row_id int not null, order_id varchar(20),order_date DATE, ship_mode varchar(30),customer_id varchar(10), customer varchar(15),segment varchar(30),profit double(10,4));

然后我通过以下MySQL查询进行了检查,

mysql> show columns from sales;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| row_id      | int          | NO   |     | NULL    |       |
| order_id    | varchar(20)  | YES  |     | NULL    |       |
| order_date  | date         | YES  |     | NULL    |       |
| ship_mode   | varchar(30)  | YES  |     | NULL    |       |
| customer_id | varchar(10)  | YES  |     | NULL    |       |
| customer    | varchar(15)  | YES  |     | NULL    |       |
| segment     | varchar(30)  | YES  |     | NULL    |       |
| profit      | double(10,4) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+

然后我通过以下查询检查了SQL模式,

mysql> SHOW VARIABLES LIKE 'sql_mode';

答案是

+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+---------------+--------------------------------------------+

然后我将其更改如下,

SET SQL_MODE='';

然后最终运行以下SQL查询以将数据从CSV加载到表中,

mysql> load data infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/sales_data.csv" into table sales fields terminated by ','lines terminated by '\r\n' ignore 1 rows;

它对我有用,但是将CSV文件保存到 C:/ ProgramData / MySQL / MySQL Server 8.0 / Uploads /