alienzzzz
интернет бизнес
Перегон DBF Файлов старой версии в SQLite
Основная задача сейчас стоит такая, перегнать файлы дбф(я так и не понял в чем они сделаны =(, но открыть нормально средствами пхп я пока не смог) в базу sqlite.
В кратце, один дурень написал когдато программу, она на фокспро или клипперподобная, тепиерь ведется работа по созданию веб портала.
Работать с DBF(причем, я не могу его подцепить в ПХП), я не хочу и не буду, поэтому я хочу перегнать в более правильную базу.
У меня есть DBF - очень старой версии(помоему фокс про, но я точно не знаю), поэтому я его не могу цепануть как базу.
Я его парсю впрямую.
Формат очень банален, есть структура, которая говорит колличество полей, и их размер и тип, после структуры идут непосредственно данные.
все строчки я получаю вот так:
после этого начинаются танцы с бубном если тип поля не строковой, потому, как числа лежат в шестнацатирочном формате, алгоритм такой :
1. 0b3cda01 - (так оно лежит в файле)
2. 01da3cb0 (реверс)
3. 31079600 (преобразуем в десятичное число)
т.е. у меня есть функция, которая строку в щестнацатиричном: 0b3cda01 преобразует в 31079600 десятичном.
___
Вот функция:
Проблема в том, что она работает не очень быстро( данных же много =( )
Можно ли как то ускорить это, например, функцией intval.
Но !
вот так работает :
echo '1.'.intval(0x3f64);
а вот так нет =(((( :
echo '2.'.intval($sStr);
Хотя если сделать вот так:
file_put_contents('ttt.ttt',$sStr);
то в файле ttt.ttt(если его смотреть в HEX редакторе), будет тоже 3F64.
перегон сейчас занимает около 1 часа, долго ждать надо - файлов 10-20 штук, в каждом 100-150 тыс данных.
Могу заслать DBF на почту, может есть какой другой вариант перегонки.
Основная задача сейчас стоит такая, перегнать файлы дбф(я так и не понял в чем они сделаны =(, но открыть нормально средствами пхп я пока не смог) в базу sqlite.
В кратце, один дурень написал когдато программу, она на фокспро или клипперподобная, тепиерь ведется работа по созданию веб портала.
Работать с DBF(причем, я не могу его подцепить в ПХП), я не хочу и не буду, поэтому я хочу перегнать в более правильную базу.
У меня есть DBF - очень старой версии(помоему фокс про, но я точно не знаю), поэтому я его не могу цепануть как базу.
Я его парсю впрямую.
Формат очень банален, есть структура, которая говорит колличество полей, и их размер и тип, после структуры идут непосредственно данные.
все строчки я получаю вот так:
PHP:
str_split ( $sDbfData, $iRowLen );
1. 0b3cda01 - (так оно лежит в файле)
2. 01da3cb0 (реверс)
3. 31079600 (преобразуем в десятичное число)
т.е. у меня есть функция, которая строку в щестнацатиричном: 0b3cda01 преобразует в 31079600 десятичном.
___
Вот функция:
PHP:
if (strlen($sStr)%2 != 0) {
$sStr = chr(0).$sStr;
}
$sStrFinal = '';
for ($i=0;$i<strlen($sStr);$i++){
$sChar = dechex(ord(substr($sStr,$i,1)));
$sStrFinal = $sChar.$sStrFinal;
dechex(ord(substr($sStr,$i+1,1).$sStrFinal));
}
$sStrFinal = ltrim($sStrFinal,'0');
return hexdec($sStrFinal);
Можно ли как то ускорить это, например, функцией intval.
Но !
вот так работает :
echo '1.'.intval(0x3f64);
а вот так нет =(((( :
echo '2.'.intval($sStr);
Хотя если сделать вот так:
file_put_contents('ttt.ttt',$sStr);
то в файле ttt.ttt(если его смотреть в HEX редакторе), будет тоже 3F64.
перегон сейчас занимает около 1 часа, долго ждать надо - файлов 10-20 штук, в каждом 100-150 тыс данных.
Могу заслать DBF на почту, может есть какой другой вариант перегонки.