Перегон DBF Файлов старой версии в SQLite

alienzzzz

интернет бизнес
Перегон DBF Файлов старой версии в SQLite


Основная задача сейчас стоит такая, перегнать файлы дбф(я так и не понял в чем они сделаны =(, но открыть нормально средствами пхп я пока не смог) в базу 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 на почту, может есть какой другой вариант перегонки.
 

whirlwind

TDD infected, paranoid
Формат старый - библиотек полно. Если мне не отшибает память, вроде даже ексель понимает DBF. Отконвертируйте в наиболее удобный для работы формат. Если хочется велосипеда, читайте спецификацию на формат - там ничего сложного нет.
 

SiMM

Новичок
[m]dbase[/m]
Единственное - memo не поддерживает - но это уж допишешь - ничего сложного.

> Если мне не отшибает память, вроде даже ексель понимает DBF.
Кстати, да. С кодировкой (там CP866, если мне память не изменяет) только, возможно, придётся повозиться.

> перегон сейчас занимает около 1 часа, долго ждать надо - файлов 10-20 штук, в каждом 100-150 тыс данных.
Да хоть сутки - это же разовая операция.
 

alienzzzz

интернет бизнес
дело в том, что мне нужно пока придумать как это сделать в автомате. потому как не все хотят пока переходить на веб =(
вот я и маюсь

-~{}~ 26.10.06 14:23:

SiMM
1. не открывает он их =(
я пробывал этими функциями.
2. поля мемо мне не нужны вообще
 

Popoff

popoff.donetsk.ua
alienzzzz
Я пользуюсь этой библиотекой для чтения и создания таких файлов. Всё работает.
 

dantistus

Новичок
In order to enable the bundled dbase library and to use these functions, you must compile PHP with the --enable-dbase option.
 

alienzzzz

интернет бизнес
dantistus
расмешил. =) а как ты думаешь я скомпилил ли с этой опцией или нет . говорят же. формат не тот !! потому как я специально создал через функции dbase другую базу и посматрел.

-~{}~ 26.10.06 17:49:

SiMM
чего не так то, яж увсе описал. не подходят функции не подходят. потому как там очень старый формат.
 

SiMM

Новичок
[m]unpack[/m]
> говорят же. формат не тот
У нас не клуб джентельменов - тут большая часть пользователей правильно вопрос задать не может, чтобы у окружающих не возникало сомнений, что всё действительно так, как и говорит автор - так что ничего удивительного, что люди переспрашивают.
 

alienzzzz

интернет бизнес
пробую . все ровно медленно ... =( хотя может я просто много хочу.
 

uliss

Новичок
А dba пробовал? - там несколько драйверов на выбор - все пробовал?
 

uliss

Новичок
alienzzzz
Случайно наткнулся:
XBSQL или Rekall
http://www.quaking.demon.co.uk/xbsql/
 
Сверху