2014-05-15 47 views
-1

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

还有其他方法可以吗?

+1

当然,打开文件,读取内容并插入每行。 –

+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; 

} 

?> 
+0

更好地使用准备好的查询。如果任何列包含双引号(或其他字符),则在发送到数据库服务器之前应该将其转义,否则这将失败。 –

1

遍历文件并用准备好的查询插入。准备好的查询也应该更快,因为数据库不必重新编译发送它的每个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); 
}