我试图将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格式看起来如此奇怪和不可接受?如果我对其他表尝试同样的代码,那么一切都像魅力一样,那么有什么问题呢?
见下文
看起来你的行是由''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, '"','')
解决了这个问题。
考虑简单地使用PHP连接到MySQL,运行query,然后输出到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;
?>
我终于解决了我的问题。
事实上@Terry是对的。表中的PROP_TYPE字段有一些问题。PROP_TYPE字段的值中有双引号",这导致了问题。例如
PROP_TYPE
"值1 "
"Value 2" ....
所以首先我必须使用update data set PROP_TYPE = replace(PROP_TYPE, '"','')
删除额外的双引号,所以现在我的问题是固定的。
感谢大家的努力。