Использовать массив разделителей

я использую fgetcsv читать CSV-файлы в моем приложении. Проблема в том, что я не знаю, будут ли мои пользователи использовать ,, |, или же ; в качестве разделителей. Если я скажу fgetcsv ничего, он только примет , но если я скажу ему использовать определенный разделитель, он только примет это.

Что я делаю сейчас:

while (($row = fgetcsv($fileHandle, 4096)) !== false) {

Я хочу что-то вроде этого:

while (($row = fgetcsv($fileHandle, 4096, array(',', ';', '|'))) !== false) {

Это возможно каким-то простым способом? Кажется действительно странным, что вы должны ограничить свой разделитель одним конкретным символом, поскольку CSV не стандартизирован.

4

Решение

Вы не можете надежно определить разделитель файла CSV, если вы его не знаете. Возьмите этот простой пример:

foo;bar,hello;world

Что такое разделитель? , или же ;? Если бы вы передали массив array(',',';') какие данные вы ожидаете fgetcsv() вернусь?

Если вы не знаете разделитель, вам нужно спросить пользователя об этом.

5

Другие решения

Использовать лига / CSV пакет, он имеет функцию обнаружения и больше функций, которые делают его целесообразным по сравнению с fgetcsv.

1

Просто чтобы дать простой ответ всем, кто борется с этим. Решение, на котором я остановился, состояло в том, чтобы заменить все разделители на определенный символ.
Как это:

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);
}

Обратите внимание, что это заменит все заданные символы на «,». Так что это будет хорошим вариантом, только если вы знать что эти символы будут использоваться только в качестве разделителей, а не содержимого. (как в моем случае)

Также сделал Сообщение блога об этом.

0
По вопросам рекламы [email protected]