MySQL:csv中的INTO OUTFILE生成无效的csv格式

时间:2015-07-31 14:33:11

标签: php mysql sql csv

我正在尝试将sql查询结果导出到csv文件中,但是csv数据看起来并不好看。

MySQL表下载链接: https://www.dropbox.com/s/vtr215bcxqo3wsy/data.sql?dl=0

CSV由sql查询生成:

下载指向原始生成的CSV文件的链接:https://www.dropbox.com/s/fnjf7ycmh08hd22/data.csv?dl=0

我正在使用以下代码:

$query = <<<EOL
 SELECT * FROM data  ORDER BY  FN ASC limit 3 
 INTO OUTFILE 'folder/data.csv'
 FIELDS TERMINATED BY ','
 OPTIONALLY ENCLOSED BY '"'
 LINES TERMINATED BY '\n'
EOL;

$result = mysql_query($query);

为什么csv格式看起来如此奇怪和不可接受? 如果我为其他表尝试相同的代码,那么一切都像魅力一样,那么什么是错的?

3 个答案:

答案 0 :(得分:1)

请参阅下面的最终答案

看起来你的行被\\n终止,它会在随机位置抛出额外的斜杠。

而是尝试双斜杠后跟n(\\n),看看会发生什么:

$query = <<<EOL
 SELECT * FROM data  ORDER BY  FN ASC limit 3 
 INTO OUTFILE 'folder/data.csv'
 FIELDS TERMINATED BY ','
 OPTIONALLY ENCLOSED BY '"'
 LINES TERMINATED BY '\\n'
EOL;

$result = mysql_query($query);

修改

最终答案

另一个观察:我注意到在你的PROP_TYPE字段中,有\ r \ n个字符。有什么方法可以使用REPLACE()函数在查询中过滤掉它们吗?

我知道您正在寻找基于SQL的解决方案,由于海量数据,这是一个难题。希望这能引导您找到正确的解决方案。

如您所述,使用update data set PROP_TYPE = replace(PROP_TYPE, '"','')解决了问题。

答案 1 :(得分:1)

考虑简单地使用PHP连接到MySQL,运行查询,然后输出到csv。

<?php

$host="localhost";
$username="user";
$password="password";
$database="dbName";

# open connection
try {
    $dbh = new PDO("mysql:host=$host;dbname=$database",$username,$password);
}
catch(PDOException $e) {  
    echo $e->getMessage();  
}
$sql = "SELECT * FROM data ORDER BY FN ASC limit 3;";
$STH = $dbh->query($sql);    

$STH->setFetchMode(PDO::FETCH_ASSOC);  

while($row = $STH->fetch()) {
    # write to csv file
    $fs = fopen("folder/data.csv","a");
        fputcsv($fs, $row);
    fclose($fs);    
}

# close connection
$dbh = null;

?>

答案 2 :(得分:1)

最后我解决了我的问题。

实际上@Terry是对的。表中的字段PROP_TYPE存在一些问题。 PROP_TYPE字段在其值中引起问题的双引号。 例如

PROP_TYPE

“价值1”

“价值2”....

首先,我必须使用update data set PROP_TYPE = replace(PROP_TYPE, '"','')删除额外的双引号,所以现在我的问题已修复。

感谢各位的努力。

我真的很感激。