я использую fgetcsv
читать CSV-файлы в моем приложении. Проблема в том, что я не знаю, будут ли мои пользователи использовать ,
, |
, или же ;
в качестве разделителей. Если я скажу fgetcsv
ничего, он только примет ,
но если я скажу ему использовать определенный разделитель, он только примет это.
Что я делаю сейчас:
while (($row = fgetcsv($fileHandle, 4096)) !== false) {
Я хочу что-то вроде этого:
while (($row = fgetcsv($fileHandle, 4096, array(',', ';', '|'))) !== false) {
Это возможно каким-то простым способом? Кажется действительно странным, что вы должны ограничить свой разделитель одним конкретным символом, поскольку CSV не стандартизирован.
Вы не можете надежно определить разделитель файла CSV, если вы его не знаете. Возьмите этот простой пример:
foo;bar,hello;world
Что такое разделитель? ,
или же ;
? Если бы вы передали массив array(',',';')
какие данные вы ожидаете fgetcsv()
вернусь?
Если вы не знаете разделитель, вам нужно спросить пользователя об этом.
Использовать лига / CSV пакет, он имеет функцию обнаружения и больше функций, которые делают его целесообразным по сравнению с fgetcsv.
Просто чтобы дать простой ответ всем, кто борется с этим. Решение, на котором я остановился, состояло в том, чтобы заменить все разделители на определенный символ.
Как это:
private function replaceDelimiters($file)
{
// Delimiters to be replaced: pipe, comma, semicolon, caret, tabs
$delimiters = array('|', ';', '^', "\t");
$delimiter = ',';
$str = file_get_contents($file);
$str = str_replace($delimiters, $delimiter, $str);
file_put_contents($file, $str);
}
Обратите внимание, что это заменит все заданные символы на «,». Так что это будет хорошим вариантом, только если вы знать что эти символы будут использоваться только в качестве разделителей, а не содержимого. (как в моем случае)
Также сделал Сообщение блога об этом.