Вытаскиваем регион, город по индексу из dbf

kombo

Новичок
Вытаскиваем регион, город по индексу из dbf

для начала, дабы предупредить недоуменные вопросы объясняю
1) в mysql не делаю потому что дамп в базу не лезет, а сидеть дробить... пока думаю обойтись меньшей кровью
2)dbase функции не использую т.к. mod_dbase у хостера не подключен.

Итак, есть файл dbf с почтовыми индексами, каких либо разделителей строк и полей в нем я не нашел, поэтому читаю его целиком в строку и в ней вырезаю побитно нужные места. Все бы хорошо, но в одном наборе полей относящихся к одному почтовому отделению указано два индекса, свой и тот кому отделение подчиняется, соответственно запись одного индекса в файле не уникальна, по некоторым признакам можно выделить нужную из них.
Вобщем вот код с рекурсивной функцией, почему на выделенную строку php ругается как Allowed memory size of 134217728 bytes exhausted (tried to allocate 19360290 bytes) ?
PHP:
$f_content=file_get_contents($db_path);

function lookString($content) {
global $f_content;$f_content='';

$content=strstr($content, $_GET["ind"]);

if(!$content) return false;
$r=substr($content, 0,436);

$arr[0]=trim(substr($r,-14));

if (!eregi("(^[0-9]{8}$)|(^[0-9]{14}$)", $arr[0]))  {
$len=strlen($content);
$content=substr($content, 6,$len-6); // -------------------------------ругается здесь
lookString($content);
}

else return $r;
}

$r=lookstring($f_content);

$arr[1]=substr($r,122,60);
$arr[2]=substr($r,182,60);
$arr[3]=substr($r,242,60);
$arr[4]=substr($r,302,60);
 

DiMA

php.spb.ru
Команда форума
набери в гугле
Allowed memory size of bytes exhausted (tried to allocate bytes)
 

kombo

Новичок
спасибо за совет. Хотелось бы услышать мнения об ошибках в самом, если они есть
 

dimagolov

Новичок
kombo, ошибка в тебе самом, наверно в днк. из-за этого и "дамп в базу не лезет" и "php ругается как Allowed memory size of 134217728 bytes exhausted" (это близко к рекорды, отожрать 132 метра и хотеть еще 20).

ну раз ты все же изобретаешь велосипед, то тебе можно дать один совет: читай не весь файл сразу, а блочно. как я помню в dbf записи фиксированной длинны, так что из заголовка вычисляется начало первой записи и ее размер и потом читаем по одной или несколько записай и разбираем их.
 

fixxxer

К.О.
Партнер клуба
ох все таки раньше хоть на бейсике-паскале учились такое делать

идешь в гугл читаешь формат дбф, он простой как два байта

идешь и читаешь в мане

fread
fseek
unpack
 

kombo

Новичок
я кренею сколько умников здесь собралось. А может вы пойдете погуляете, дадите людям спокойно обсудить свои дела, особенно если по делу нечего сказать ?

дежурному типа врачу, покаж ка мне пальцем где там у меня в коде 20 меговый файл отжирает 132 мега. Я наверное его не резал прежде чем спросить. Резал и на 10 частей и на 20, переменные не множил, всех писал в самих себя за операцию.

фиксер, а ты сам когда нибудь таким образом корректно считывал поля из дбф ? а если файл побитый слегка, то куда это у тебя все съедет ? не знай как тебе, но мне всякую крень юзеру выдавать нельзя, делом занимаюсь, а не на форуме просиживаю в поисках кого подъепнуть

-~{}~ 19.03.09 23:53:

вобщем всего делов было заменит ту строку на $content=ltrim("(^[0-9]{6})",$content); Развели тут...
 

kombo

Новичок
не находит, а вырезает найденный индекс если определит его что он не индекс этого отделения, а вышестоящего и ищет новый индекс в строке $content=strstr($content, $_GET["ind"]);
предыдущая версия строки как раз этим и пыталась заниматься - вырезанием
 

dimagolov

Новичок
kombo, ты наверное удивишься, но сделай после $content=ltrim("(^[0-9]{6})",$content); var_dump($content);
как сделаешь, то сходи в [m]ltrim[/m]
:)
 
Сверху