The CSV specification doesn't leave room for any sort of file integrity check. So if you are hoping to so something that a CSV parser will pick up on automatically, you can't. Part of the issue is that there isn't really a CSV specification, and in my experience different parsers have slightly different definitions of what CSV means. Either way, there is no integrity check built into the CSV "specification" that you can expect any CSV parser to automatically notice. Adding something to the end would give the end user a chance to verify the file themselves, but then again I doubt anyone would actually bother checking.
One possible option would be to send the content length along with the file. Then the browser may detect an interrupted download when the total content doesn't match what it was told to expect. The exact behavior there probably varies from browser to browser though, and you would have to run some tests to see if that is actually helpful.
However, that also requires you to know the length of the file before hand, which means building it all in memory, measuring the size, and then dumping to the browser. That has some disadvantages itself, including the fact that you are limited by the size of your memory (although you can mitigate that with php://temp). Also, the download won't start until the file is fully built, and depending on how long that takes it might result in more cancelations if the user thinks the download is frozen.
A completely different solution would be to write the file contents to disk (in the background) and then email the user with a download link when the file is built. This way they aren't waiting on your download script, and the actual download will simply be a simple file download managed directly by your web server, which will be much faster and less prone to errors.