Der Client weiß nicht, dass es sich um eine CSV-Datei handelt (es ist schließlich nur Text!).
Versuchen Sie, dies VOR jeder Ausgabe hinzuzufügen (am Anfang Ihres Skripts):
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
Im Grunde teilen Sie dem Client/Browser mit, dass die Daten, die Sie senden, eine CSV-Datei sind.
Das sollte funktionieren.
Weitere Informationen zu Headern finden Sie dort:http://php.net/manual/ de/function.header.php