[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Из Exel в БД , как правильно сделать
KonstantinK
Подскажите, в общем такая задача. Необходимо создать функционал который позволяет переносить данные из Exel файла(прайс лист) в БД. Я предложил заказчику чтоб он переводил файлы .xls в формат .csv , заказчик согласен. Так как файлы все равно сначала будут открываться в Exel то и перевод в CSV формат будет делаться через Exel. Вроде бы все просто, делаю так.
//считываем файл в массив
$first_arr = file($_FILES['filename']['tmp_name']);

for($i = 0; $i < count($first_arr); $i++)
{
//определяем кодировку строки
$cod = mb_detect_encoding($first_arr[$i]);
//перекодируем в utf-8
$first_arr[$i] = iconv ($cod, 'utf-8', $first_arr[$i]);

}

но скрипт ругуется вот так
Notice: iconv() [function.iconv]: Detected an illegal character in input string in Z:\home\monitoring\www\admin\pharmacy\price_add_controller.php on line 81


строка 81 это
 $first_arr[$i]  = iconv ($cod, 'utf-8', $first_arr[$i]);


в массиве $first_arr данные попадают обрезанные, я так понимаю обрезает русские слова.

если сам csv файл предварительно открываю в Notepad++ и перекодирую его в UTF-8 без BOM то все считывается нормально и без перекодирования в скрипте.

Подскажите как мне решить задачку может надо в Exel как то по другому переводить в CSV формат или как перекодировать данные в PHP.



Спустя 4 минуты, 17 секунд (5.08.2011 - 21:52) Winston написал(а):
А если так попробовать
$first_arr[$i]  = iconv ($cod, 'utf-8//TRANSLIT', $first_arr[$i]);

Спустя 10 минут, 14 секунд (5.08.2011 - 22:02) Invis1ble написал(а):
KonstantinK
Посмотри в сторону Spreadsheet_Excel_Reader, я с помощью него экспортировал из xls в БД

Спустя 14 минут, 21 секунда (5.08.2011 - 22:17) KonstantinK написал(а):
Winston
Не не помогает, тоже самое выдает.


Invis1ble
Да я знаю про Spreadsheet_Excel_Reader , но с CSV вроде проще казалось должно получиться , может что придумаем все-таки.

Спустя 6 минут, 4 секунды (5.08.2011 - 22:23) Invis1ble написал(а):
KonstantinK
тогда попробуй mb_convert_encoding() или накрайняк convert_cyr_string()
и еще попробуй указывать явно исходную кодировку

кстати
Цитата
Notice: iconv() [function.iconv]: Detected an illegal character in input string

у меня такое тоже выскакивало помню, хотя тетстировал с корректными кодировками. Потом пропал такой нотайс (то ли сам по себе, толи я заново сервер поднял)

Спустя 59 секунд (5.08.2011 - 22:24) Winston написал(а):
Цитата (KonstantinK @ 5.08.2011 - 21:48)
mb_detect_encoding

Может проблема в этой ф-е? Какой результат она возвращает? ASCII?
В $cod должно быть windows-1251

Спустя 2 минуты, 2 секунды (5.08.2011 - 22:26) Invis1ble написал(а):
Winston
Цитата
Какой результат она возвращает?

она пытается определить кодировку самостоятельно

Спустя 2 минуты, 40 секунд (5.08.2011 - 22:28) Winston написал(а):
Цитата (Invis1ble @ 5.08.2011 - 22:26)
она пытается определить кодировку самостоятельно

Это я понял, но, что она выдаст если написать
$first_arr = file($_FILES['filename']['tmp_name']);
echo mb_detect_encoding($first_arr[0]);

Что выведет? ASCII ?

Спустя 3 минуты, 49 секунд (5.08.2011 - 22:32) Invis1ble написал(а):
А, ты спрашиваешь у ТС, в какой кодировке файл....
Тут дело может быть в другом, а именно я же говорю, что тестировал с явным указанием кодировки, но все равно был нотайс. Вот. Читать начиная с 4-го поста.

Спустя 38 минут, 3 секунды (5.08.2011 - 23:10) KonstantinK написал(а):
Winston
$first_arr = file($_FILES['filename']['tmp_name']);
echo mb_detect_encoding($first_arr[0]);


Пробовал выводит "UTF-8" .

Спустя 3 минуты, 48 секунд (5.08.2011 - 23:14) Winston написал(а):
Цитата (KonstantinK @ 5.08.2011 - 21:48)
//определяем кодировку строки
                $cod = mb_detect_encoding($first_arr[$i]);
                //перекодируем в utf-8
              $first_arr[$i]  = iconv ($cod, 'utf-8', $first_arr[$i]);

Цитата (KonstantinK @ 5.08.2011 - 23:10)
Пробовал выводит "UTF-8"

Хм... так может тогда не нужно здесь iconv ?

Спустя 4 минуты, 1 секунда (5.08.2011 - 23:18) Invis1ble написал(а):
Цитата
Пробовал выводит "UTF-8"

если так, то скорее всего не нужен )

Спустя 3 минуты, 55 секунд (5.08.2011 - 23:22) Invis1ble написал(а):
а если так:
$first_arr = file($_FILES['filename']['tmp_name']);
echo mb_detect_encoding(implode(PHP_EOL, $first_arr)); // больше инфы для анализа

?

Спустя 2 минуты, 47 секунд (5.08.2011 - 23:25) KonstantinK написал(а):
Invis1ble
тоже выдает UTF-8

Спустя 1 минута, 11 секунд (5.08.2011 - 23:26) Invis1ble написал(а):
KonstantinK
Цитата
тоже выдает UTF-8

тогда зачем ковертировать пытаешься из UTF-8 в UTF-8 ? smile.gif

Спустя 11 секунд (5.08.2011 - 23:26) Winston написал(а):
Странно... xls файл в формате utf-8 huh.gif

Спустя 9 минут, 25 секунд (5.08.2011 - 23:36) KonstantinK написал(а):
Invis1ble
Потому что без кодировки я получаю из csv файла вот такие кракозяблы
 5-��� 50�� ���. �/� �50 ������/Lek(������ ) ;112,50;


Может и вправду придется использовать Spreadsheet_Excel_Reader .

Спустя 2 минуты, 17 секунд (5.08.2011 - 23:38) Invis1ble написал(а):
KonstantinK
Цитата
Потому что без кодировки я получаю из csv файла вот такие кракозяблы

может проблема на уровне вывода?

Спустя 3 минуты, 22 секунды (5.08.2011 - 23:41) Invis1ble написал(а):
Вообще, странно конечно, что файл в UTF-8....
попробуй похимичить со вторым аргументом mb_detect_encoding()

Спустя 3 минуты, 53 секунды (5.08.2011 - 23:45) Invis1ble написал(а):
KonstantinK
есть идея: скинь файл, я пробью его кодировку в enca, чтоб наверняка знать

Спустя 6 минут, 39 секунд (5.08.2011 - 23:52) KonstantinK написал(а):
Invis1ble Вот погляди файл, а я уже спать. Отпишись, я завтра посмотрю если идей новых не возникнет то буду делать на Spreadsheet_Excel_Reader.

Хочется всегда попроще сделать, но не всегда удается biggrin.gif

Спустя 3 минуты, 35 секунд (5.08.2011 - 23:55) Winston написал(а):
Файл в кодировке windows-1251 потому ее и нужно указывать в первом аргументе iconv
А не полагаться на mb_detect_encoding



Спустя 1 минута, 39 секунд Winston написал(а):
Файл перевел в utf8 теперь эксель крякозябры выдает wacko.gif

Спустя 4 минуты, 24 секунды (6.08.2011 - 00:00) Invis1ble написал(а):
KonstantinK
Гляди результаты:
how iconv calls the encoding
CP1251

preferred MIME encoding name
windows-1251

RFC 1345 (or otherwise canonized) encoding name
CP1251

how cstocs calls the encoding
???

Отсюда вывод - mb_detect_encoding() срабатывает некорректно.
Попробуй указывать явно исходную кодировку - CP1251.

Спустя 19 минут, 52 секунды (6.08.2011 - 00:20) Invis1ble написал(а):
Вот неплохая статья, на мой взгляд по теме детекта кодировки. Развеивает надежды на mb_detect_encoding() smile.gif

Спустя 10 часов, 11 минут, 17 секунд (6.08.2011 - 10:31) KonstantinK написал(а):
Winston
Invis1ble
Спасибо ребята, прямо указал кодировку cp1251 вроде заработало, я всегда знал что одна голова хорошо, а три лучше! biggrin.gif

Спустя 9 часов, 8 минут, 28 секунд (6.08.2011 - 19:39) Invis1ble написал(а):
KonstantinK
Пожалуйста smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.