2015-08-06 4 views
1

Я пытаюсь прочитать строку CSV, используя fgetcsv. Однако, похоже, не все равно касается корпусов.fgetcsv не читает шкафы

Вот что линия выглядит следующим образом:

Super Administrator,"ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST" 

Это действует линия по стандартам CSV, и он должен возвращать следующие с " в качестве корпуса и , в качестве разделителя:

$l = fgetcsv($handle, 0, ',', '"'); 
array(
    [0] => 'Super Administrator', 
    [1] => 'ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST', 
); 

Однако это то, что я получаю:

$l = fgetcsv($handle, 0, ',', '"'); 
array(
    [0] => 'Super Administrator', 
    [1] => '"ROLE_SUPER_ADMIN', 
    [2] => ' ROLE_GROUP_GUEST', 
    [3] => ' ROLE_GROUP_WRITER', 
    [4] => ' ROLE_USER_WRITER', 
    [5] => ' ROLE_USER_GUEST"', 
); 

Так что да, кажется fgetcsv прав, полностью игнорируя характер корпуса. Я попытался заставить его работать с использованием fgets, а затем str_getcsv, но результат тот же - str_getcsv, скорее всего, вызван fgetcsv для преобразования CSV.

Я полагал, что это может быть какая-то ошибка регрессии, которая нашла свой путь в версии PHP, я использую, так что я вставив результат команды php -v здесь:

[email protected]:~/$ php -v 
PHP 5.5.27-1+deb.sury.org~trusty+1 (cli) (built: Jul 15 2015 12:14:44) 
Copyright (c) 1997-2015 The PHP Group 
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies 
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies 

Я считаю, что это это последняя версия PHP5 на момент написания этой статьи. Хотя я подозреваю, что это какая-то ошибка PHP, это также может быть проблемой установки/конфигурации, поэтому я публикую этот вопрос.

Кто-нибудь уже испытал это? Каков наилучший способ решить эту проблему?

EDIT:
Как отметил Марк Бейкер, PHP5.5.27-1 на самом деле последняя версия PHP5.5 в настоящее время.

EDIT 2:
Вот попытка с функцией bin2hex, отображается с var_dump.

Строка ",","," (2 ячейки, содержащие только кома в каждой ячейке): 0022002c0022002c0022002c0022000a.

С bin2hex('"') результатом является только 22.

str_getcsv все еще дает мне эту ошибку.

+0

5.6.11 - последняя версия PHP, а не 5.5.27 .... это только последняя ревизия в ветке 5.5. –

+2

Но функция str_getcsv(), которая использует один и тот же код разбора, - работает правильно со всеми версии PHP назад до 5.3.0 (когда был введен str_getcsv()) .... вы абсолютно уверены, что оболочка в вашем файле является символом '' '(ASCII 0x22), а не' & quot' или аналогичным –

+0

Спасибо за точность в отношении PHP-версии. О вашем втором комментарии, да, я уверен в этом. Фактически я использую LibreOffice (excel ripoff на Ubuntu), и это программное обеспечение, а не я, добавляет '' '. Даже при этом, когда я открываю файл в текстовом редакторе, отображается символ '' ', а не что-то еще. – Zephyr

ответ

1

OK, решался.

Это то, что все подозревали: кодировка файла была испорчена. Я не мог знать, какой кодировкой это было, но LibreOffice предлагал мне Unicode всякий раз, когда я пытался открыть CSV.

Мне пришлось открыть их с помощью nano, чтобы понять, что действительно существует проблема с кодировкой. Gedit, vim или любой другой инструмент, который у меня был на моем компьютере, не вызывал ошибок. При открытии с помощью nano между любыми другими символами был вставлен символ @, и фиды строк были неправильно прочитаны.

Кажется, есть некоторые кодировки, которые не поддерживаются fgetcsv.Чтобы решить проблему, я воссоздал файлы с nano (copy-paste из другого инструмента, который не отображал @).

Смежные вопросы