CSV расшифровывается как «Comma Separated Values», таким образом, как бы подразумевая, что это список значений, разделённых запятой. Но оказалось, что на самом деле это не совсем так.

В Windows есть настройка «List Separator», которая и используется для определения разделяющего символа (в Excel, по крайней мере), и написать туда можно все, что угодно.

Для Windows это значение можно получить с помощью GetLocaleInfoEx + LOCALE_SLIST. Что делать в общем случае, на других платформах, не ясно. Вероятно, лучшим решением будет предоставление пользователю возможности ввести разделитель самостоятельно.

Update.
Все-таки существует RFC для CSV. Так что Excel не прав, но кому от этого легче? :)