将csv导入mysql而不加载数据infile

时间:2014-05-15 13:56:32

标签: php mysql csv

我必须将csv导入mysql数据库 我无法使用加载数据infile,因为它已在Web服务器上禁用。

有没有其他方法可以这样做?

2 个答案:

答案 0 :(得分:1)

如果您有可用的脚本语言,则可以遍历CSV行并生成SQL代码:

PHP示例:

<?php

$lines = file('file.csv');

foreach($lines as $line){
    //sepatates each cell by the delimiter "," (watch for delimiters in the cell, escaped or not)
    $cell = explode(",",$line);

    $sql = "INSERT INTO table (col1,col2,col3) VALUES (";
    $sql.= "'".$cell[0]."','".$cell[1]."','".$cell[2]."');";

    echo $sql;

}

?>

答案 1 :(得分:1)

循环浏览文件并使用准备好的查询进行插入。准备好的查询也应该更快,因为DB不必重新编译您发送它的每个SQL字符串。当你有成千上万行时,这将更加明显。

<?php
// assume $db is a PDO connection
$stmt = $db->prepare('INSERT INTO table (col1, col2, col3) VALUES(?, ?, ?)');

// read file contents to an array
$lines = file('file.csv');

// insert each line
foreach ($lines as $line) {
    // see manual to specify $delimter, $enclousure, or $more
    $cols = str_getcsv($lines);
    $stmt->execute($cols);
}

那将会奏效。由于我们正在使用file(),因此如果您的CSV文件是巨大的,脚本会占用大量内存。要更好地利用资源,请执行以下操作,一次只在内存中保留一行:

<?php
// assume $db is a PDO connection
$stmt = $db->prepare('INSERT INTO table (col1, col2, col3) VALUES(?, ?, ?)');

$handle = fopen('test.csv', 'r');
while ($cols = fgetcsv($handle)) {
  $stmt->execute($cols);
}