чтение из строки с указателя

Pustota

Новичок
чтение из строки с указателя

Есть строка длиной 1000 символов.
Например: $buffer="abcdefgh....................................";
Нужно прочитать её всю до конца? носледующим образом:
с первого по 4 символ, потом с 4 по 5, потом с 5 по 10 и т.д. То есть разбить на определённые куски.
Substr не подходит по причине того, что если потом где-нибудь в середину вставится ещё элемент, всю оставшуюся часть придётся править. Поэтому решил считывать с указзателя, одновременно перемещая его на нужную длину.

Было:
Код:
echo substr($buffer, 0, 4).", ".
      substr($buffer, 4, 1).", ". 
      substr($buffer, 5, 1).", ". 
      substr($buffer, 6, 4).", ". 
      substr($buffer, 10, 6).", ".
      substr($buffer, 16, 3).", ". 
      substr($buffer, 19, 3);
Но, повторяюсь, так не пойдёт. Изменится длина куска с 10 позиции и после неё придётся всё править.
Как сделать чтобы я мог прочитать сначала 4 символа, потом с текущей позиции, где остановился, 1, потом 1, потом 4 и т.д.???
 

Фанат

oncle terrible
Команда форума
что означает "если потом где-нибудь в середину".
потом - это когда? в другом тысячелетии?
что значит "придётся править"?
 

Pustota

Новичок
Потом - через месяц, к примеру.
Изменится длина второго куска, который сейчас равен одному символу, а потом будет равен двум символам. И полезет всё остальное. все циферки на +1 переправлять.

PS: я немного о другом: Как читать указывая только длину нужного куска, а откуда - чтобы автоматически определял окончание последнего куска.
 

Фанат

oncle terrible
Команда форума
почему вся эта структура хранится в строке, а не более удобоваримом формате?

где и в каком формате ты собрался хранить формат чтения?
 

Pustota

Новичок
Ну и вопросы. Хорошо, постараюсь всю кухню объяснить. Строка хранится в файле. Точнее их в файле несколько тысяч. Появляется этот файл из базы Oracle. Такие файлы ещё называют "плоскими". потом мне надо этот плоский файл разбить по кусочкам и запихнуть в DBF для другой базы.
 

avm

Новичок
Код:
<?php
$buffer="1234567890";
$x = sscanf($buffer,"%4s%1s%1s%4s");
print_r($x);
?>
вариант медленный, но зато очевидный и формат задать просто.

хотя решать следует имеено задачу переноса данных в DBF, а не парсинга строки...
 

Фанат

oncle terrible
Команда форума
Pustota
ты на вопрос ответь.
где ты собрался хранить формат - цыферки свои эти - 4, 5, 6, 10...
 

Pustota

Новичок
Автор оригинала: avm
Код:
<?php
$buffer="1234567890";
$x = sscanf($buffer,"%4s%1s%1s%4s");
print_r($x);
?>
вариант медленный, но зато очевидный и формат задать просто.

хотя решать следует имеено задачу переноса данных в DBF, а не парсинга строки...
Спасибо большое. А по поводу переноса данных - да, я знаю, что лучше бы сразу комплексно решить вопрос о переносе из Оракла в DBF. Но тут уже большая часть задачи уже была решена.

2Фанат: Какие циферки? длину каждого элемента или позицию с которого будет считываться? Если первое - то в программе, а от второго хотел уйти. Правда вот уже подсказали хороший вариант.
 

Фанат

oncle terrible
Команда форума
"в программе" - это отличное описание.
возьму на вооружение.
Как - спросят меня - в базу данных строку добавить?
А я им отвечу - в программе!
И все. Сразу. Всё. Поймут.

Скажи, ты арифметику в школе учил?
echo substr($buffer, 0, 4).", ".
substr($buffer, 4, 1).", ".
substr($buffer, 5, 1).", ".
substr($buffer, 6, 4).", ".
substr($buffer, 10, 6).", ".
substr($buffer, 16, 3).", ".
substr($buffer, 19, 3);
по какой формуле можно вычислить первую цифру нижеследующей строчки из двух цифр предыдущей?
 

Pustota

Новичок
Может, конечно, я труднодоступно объясняю, так, что меня не могут понять, но мне уже подсказали нужное мне решение.

-~{}~ 22.01.07 17:44:

Теперь не могу запихнуть этот массив. Вываливается такая ошибка:
Warning: dbase_add_record() [function.dbase-add-record]: Expected array as second parameter in dbase.php on line 31

Код:
$x = sscanf($buffer,"%4s%1s%1s%4s%6s%3s%3s%4s");
dbase_add_record($db, $x);
структура DBF файла:
Код:
$def = array(
  array("A01", "N", 4, 0),
  array("A02", "N", 1, 0),
  array("A30", "N", 1, 0),
  array("A31", "N", 4, 0),
  array("A03", "N", 6, 0),
  array("A04", "N", 3, 0),
  array("A05", "N", 3, 0),
  array("A06", "N", 4, 0)
);
Вроде $x - это массив. количество элементов 8. Как раз подходит под размер DBF. На что он ругается. Если заменить строчку
dbase_add_record($db, $x);
на
dbase_add_record($db, array($x[0], $x[1], $x[2], $x[3], $x[4], $x[5], $x[6], $x[7]));
то всё работает. Почему не работает первый вариант?
 
Сверху