За последние 24 часа нас посетил 16121 программист и 1666 роботов. Сейчас ищут 919 программистов ...

Импорт данных foxpro

Тема в разделе "PHP и базы данных", создана пользователем ShamahN, 14 апр 2010.

  1. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Такая ситуация. Достаточно часто нужно производить подгрузку данных передаваемых сторонними разработчиками. Они у нас ушли не далеко и самым модным форматом считается базы фокспро (даже досовского еще, по-моему) =)
    Ну. Вот, собственно, и проблема.
    Я нашел погуглив 2 возможных решения
    0. dbase
    1. ODBC

    Про первый почитал, что-то меня насторожило, что библиотеку исключили из дистрибутива (выше пхп 5.3 вроде).
    Для применения второго варианта
    Код (Text):
    1. resource odbc_connect  (  string $dsn  ,  string $user  ,  string $password  [,  int $cursor_type  ] )
    я так и не нагуглил $dsn

    Да и решил посоветоваться с гуру. Может (скорее всего) есть варианты более приемлемые.
    Сразу сделаю оговорочку, что вся система, в конечном итоге, будет переноситься на freebsd и усановка в нее (фрю) всяких драйверов, наверное нежелательна (если не необходима).
     
  2. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Удивительно, что никто не сталкивался =(
     
  3. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Библиотеку исключили потому что время пришло. Формат уходит со сцены.

    Можно работать через dbase
    Можно разобрать формат ручками (он простой как два пальца об асфальт - маркер, длина заголовка, заголовок, fixed size записи)
    Можно в Excel открывать и сохранять в csv.
    Можно поискать утилиты конвертации dbf2csv и втягивать csv.

    Вариантов - море.
     
  4. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Simpliest, но все какие-то страшные) Основная задача, - сейчас все максимально подогнать под ситуацию, чтобы в будущем сэкономить себе драгоценное время)
    Таких файлов месяц может тысячи прийти, и представьте себе все их перегонять из формата в формат =)
    В общем, получилось у меня вроде соединиться с файликом через odbc
    Код (Text):
    1. $megastr = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=$dir;";
    2. $connection = odbc_connect($megastr, "", "");
    Запросы тоже проходят
    Код (Text):
    1. $strsql= "SELECT * FROM $dbf_file";
    В принципе, все прозрачно. Если бы не одно НО.. - весь мозг себе уже вынес... эта ерунда, выводит кракозябры, чтобы я не делал. Даже браузером перебирая кодировки не могу получить нормальное отображение...
    Даже идей никаких нет. Уповаю на вас)

    Прицеплю даже файлик чтобы было что попробовать
    и кусок кода
    PHP:
    1.     private function import_from_dbf($dbf_file, $dir) {
    2.         $dir = $_SERVER['DOCUMENT_ROOT']."/".$dir;
    3.         $megastr = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=$dir;";
    4.      
    5.         $connection = odbc_connect($megastr, "", "");
    6.         if (!$connection) echo("фиг тебе максим.");
    7.        
    8.         $strsql= "SELECT * FROM $dbf_file";
    9.  
    10.         $query = odbc_exec($connection, $strsql) or die (odbc_errormsg());
    11.         for ($i=1; $i<20; $i++) {
    12.             $rows = odbc_fetch_object($query);
    13.             echo($rows->STREET)." = ";
    14.         }
    15.         die();
    16.     }
     
  5. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    мде.. результат неожиданный.
    Изменения в реестре
    Код (Text):
    1.  
    2. HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage - OEM
    3. поменял на
    4. HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage - ANSI
    Привело к нужному результату. Какие можно сделать выводы:
    0. Абсолютно непонятно, что делать если будут передаваться файлы с разными кодировками
    1. Драйверы данных - часть системы (что очень не хотелось). Следовательно, при переносе системы на другую ОС нужно быть готовым к танцам с бубнами.

    В общем и целом, вариант не слишком приемлемый..

    Кто как думает, если все же стянуть откуда-нить библиотеку php_dbase.dll и прикрутить ее. Как в последствии это может повернуться?=)
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    cp1251 - во всяком случае содержимое файла.

    Определять. Или отшивать.
    Других вариантов нет.

    Взять и проверить.
    Конвертация даже тысяч файлов автоматизируется.
    Точнее, тем более тысяч файлов - автоматизируется.