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 — Obtém o delimitador, o caractere de fechamento e o caractere de escape para CSV
Obtém o delimitador, o caractere de contorno e o caractere de escape usados para analisar os campos CSV.
Esta função não possui parâmetros.
Retorna um array indexado contendo o delimitador, o caractere de contorno e o caractere de escape.
| Versão | Descrição | 
|---|---|
| 7.4.0 | O caractere de escape agora pode ser uma string vazia. | 
| 7.0.10 | Adicionado o caractere de escape ao array retornado. | 
Exemplo #1 Exemplo de SplFileObject::getCsvControl()
<?php
$file = new SplFileObject("data.txt");
print_r($file->getCsvControl());
?>O exemplo acima produzirá algo semelhante a:
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.
<?php
file_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);
}