Такая ситуация. Достаточно часто нужно производить подгрузку данных передаваемых сторонними разработчиками. Они у нас ушли не далеко и самым модным форматом считается базы фокспро (даже досовского еще, по-моему) =) Ну. Вот, собственно, и проблема. Я нашел погуглив 2 возможных решения 0. dbase 1. ODBC Про первый почитал, что-то меня насторожило, что библиотеку исключили из дистрибутива (выше пхп 5.3 вроде). Для применения второго варианта Код (Text): resource odbc_connect ( string $dsn , string $user , string $password [, int $cursor_type ] ) я так и не нагуглил $dsn Да и решил посоветоваться с гуру. Может (скорее всего) есть варианты более приемлемые. Сразу сделаю оговорочку, что вся система, в конечном итоге, будет переноситься на freebsd и усановка в нее (фрю) всяких драйверов, наверное нежелательна (если не необходима).
Библиотеку исключили потому что время пришло. Формат уходит со сцены. Можно работать через dbase Можно разобрать формат ручками (он простой как два пальца об асфальт - маркер, длина заголовка, заголовок, fixed size записи) Можно в Excel открывать и сохранять в csv. Можно поискать утилиты конвертации dbf2csv и втягивать csv. Вариантов - море.
Simpliest, но все какие-то страшные) Основная задача, - сейчас все максимально подогнать под ситуацию, чтобы в будущем сэкономить себе драгоценное время) Таких файлов месяц может тысячи прийти, и представьте себе все их перегонять из формата в формат =) В общем, получилось у меня вроде соединиться с файликом через odbc Код (Text): $megastr = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=$dir;"; $connection = odbc_connect($megastr, "", ""); Запросы тоже проходят Код (Text): $strsql= "SELECT * FROM $dbf_file"; В принципе, все прозрачно. Если бы не одно НО.. - весь мозг себе уже вынес... эта ерунда, выводит кракозябры, чтобы я не делал. Даже браузером перебирая кодировки не могу получить нормальное отображение... Даже идей никаких нет. Уповаю на вас) Прицеплю даже файлик чтобы было что попробовать и кусок кода PHP: private function import_from_dbf($dbf_file, $dir) { $dir = $_SERVER['DOCUMENT_ROOT']."/".$dir; $megastr = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=$dir;"; $connection = odbc_connect($megastr, "", ""); if (!$connection) echo("фиг тебе максим."); $strsql= "SELECT * FROM $dbf_file"; $query = odbc_exec($connection, $strsql) or die (odbc_errormsg()); for ($i=1; $i<20; $i++) { $rows = odbc_fetch_object($query); echo($rows->STREET)." = "; } die(); }
мде.. результат неожиданный. Изменения в реестре Код (Text): HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage - OEM поменял на HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage - ANSI Привело к нужному результату. Какие можно сделать выводы: 0. Абсолютно непонятно, что делать если будут передаваться файлы с разными кодировками 1. Драйверы данных - часть системы (что очень не хотелось). Следовательно, при переносе системы на другую ОС нужно быть готовым к танцам с бубнами. В общем и целом, вариант не слишком приемлемый.. Кто как думает, если все же стянуть откуда-нить библиотеку php_dbase.dll и прикрутить ее. Как в последствии это может повернуться?=)
cp1251 - во всяком случае содержимое файла. Определять. Или отшивать. Других вариантов нет. Взять и проверить. Конвертация даже тысяч файлов автоматизируется. Точнее, тем более тысяч файлов - автоматизируется.