Я использовал решение @Jay Bhatt для определения разделителя файла csv, но он не работал для меня, поэтому я применил несколько исправлений и комментариев, чтобы процесс был более понятным.
Смотрите мою версию функции @Jay Bhatt:
function decide_csv_delimiter($file, $checkLines = 10) {
// use php's built in file parser class for validating the csv or txt file
$file = new SplFileObject($file);
// array of predefined delimiters. Add any more delimiters if you wish
$delimiters = array(',', '\t', ';', '|', ':');
// store all the occurences of each delimiter in an associative array
$number_of_delimiter_occurences = array();
$results = array();
$i = 0; // using 'i' for counting the number of actual row parsed
while ($file->valid() && $i <= $checkLines) {
$line = $file->fgets();
foreach ($delimiters as $idx => $delimiter){
$regExp = '/['.$delimiter.']/';
$fields = preg_split($regExp, $line);
// construct the array with all the keys as the delimiters
// and the values as the number of delimiter occurences
$number_of_delimiter_occurences[$delimiter] = count($fields);
}
$i++;
}
// get key of the largest value from the array (comapring only the array values)
// in our case, the array keys are the delimiters
$results = array_keys($number_of_delimiter_occurences, max($number_of_delimiter_occurences));
// in case the delimiter happens to be a 'tab' character ('\t'), return it in double quotes
// otherwise when using as delimiter it will give an error,
// because it is not recognised as a special character for 'tab' key,
// it shows up like a simple string composed of '\' and 't' characters, which is not accepted when parsing csv files
return $results[0] == '\t' ? "\t" : $results[0];
}
Я лично использую эту функцию, чтобы помочь автоматически разобрать файл с PHPExcel , и она работает красиво и быстро.
Я рекомендую проанализировать не менее 10 строк, чтобы результаты были более точными. Я лично использую его с 100 строками, и он работает быстро, без задержек и лагов. Чем больше строк вы анализируете, тем точнее получается результат.
ПРИМЕЧАНИЕ: Это всего лишь модифицированная версия решения @Jay Bhatt для этого вопроса. Все кредиты отправляются @Jay Bhatt.