Note that this function does not magically guess the CSV control from a given file, rather it returns what has been priorly set with SplFileObject::setCsvControl().
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
SplFileObject::getCsvControl — Получает символы разделителя, ограничителя и экранирования CSV-полей
Метод получает разделитель полей, ограничитель значений полей и символ экранирования для CSV-полей.
У этой функции нет параметров.
Метод возвращает индексный массив, который содержит символы разделителя, ограничителя и экранирования.
Версия | Описание |
---|---|
7.4.0 | Пустую строку теперь разрешается использовать как символ экранирования. |
7.0.10 | В массив с результатами добавили символ экранирования. |
Пример #1 Пример получения символов разделителя, ограничителя и экранирования методом SplFileObject::getCsvControl()
<?php
$file = new SplFileObject("data.txt");
print_r($file->getCsvControl());
?>
Вывод приведённого примера будет похож на:
Array ( [0] => , [1] => " [2] => \ )
Note that this function does not magically guess the CSV control from a given file, rather it returns what has been priorly set with SplFileObject::setCsvControl().
Seems that this function always returns the same delimiter.<?phpfile_put_contents("A;B;C;D\n0;0;0;0", "test.txt");$file = new SplFileObject("test.txt"); var_dump($file->getCsvControl());?>array(2) { [0]=> string(1) "," [1]=> string(1) """}
Given an absolute path to a CSV or any text file and a list of possible delimiters and assuming lines are up to 4096 characters long, I use<?php function guess_delimiter($file, $delimiters=[',',';']) { $h = fopen($file,'r'); $count = []; foreach ($delimiters as $del) { $count[$del] = 0; while (($bufer = fgets($h, 4096)) !== false) { $count[$del]+=substr_count($bufer, $del); } rewind($h); } fclose($h); return array_search(max($count), $count);}