Я читаю CSV-файл с php. Многие из строк имеют «галочку», которая на самом деле является символом квадратного корня: √ и PHP-код просто пропускает этот символ каждый раз, когда он встречается.
Вот мой код (печать в окне браузера в формате «CSV style», чтобы я мог проверить, что строки сломаются в нужном месте:
$file = fopen($uploadfile, 'r'); while (($line = fgetcsv($file)) !== FALSE) { foreach ($line as $key => $value) { if ($value) { echo $value.","; } } echo "<br />"; } fclose($file);
В качестве промежуточного решения я просто нахожу и заменяю галочки на 1 вручную, в Excel. Очевидно, мне хотелось бы получить более эффективное решение 🙂 Спасибо за помощь!
fgetcsv () работает только с обычными символами ASCII; так что это, вероятно, «правильно» при пропуске ваших квадратных символов корня. Однако вместо того, чтобы вручную заменять галочки, вы можете прочитать файл в строке, сделать str_replace () для этих символов, а затем проанализировать его с помощью fgetcsv (). Вы можете превратить строку в указатель файла (для fgetcsv):
$fp = fopen('php://memory', 'rw'); fwrite($fp, (string)$string); rewind($fp); while (($line = fgetcsv($fp)) !== FALSE) ...
У меня была аналогичная проблема с акцентированными первыми символами строк. Я в конце концов отказался от fgetscv и сделал следующее, используя fgets()
и explode()
вместо этого (я предполагаю, что ваш csv разделен запятыми):
$file = fopen($uploadfile, 'r'); while (($the_line = fgets($file)) !== FALSE) // <-- fgets { $line = explode(',', $the_line); // <-- explode foreach ($line as $key => $value) { if ($value) { echo $value.","; } } echo "<br />"; } fclose($file);
Вы должны указывать в документации
Примечание. Эта функция учитывается в настройках локали. Если LANG, например, en_US.UTF-8, файлы в однобайтовом кодировании неправильно считываются этой функцией.
перед fgetcsv добавить setlocale (LC_ALL, 'en_US.UTF-8'). В моем случае это было «lt_LT.UTF-8».
Такое поведение сообщается как ошибка php