powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Необходимо разбить файл
8 сообщений из 8, страница 1 из 1
Необходимо разбить файл
    #36721465
dualshock2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача такая формируется файл каждый раз в нем разное кол-во записей, необходимо разбить файл по 2000 записей. Т.е в одном файле не должно быть большее 2000 записей. Помогите никак не сображу как это сделать.
...
Рейтинг: 0 / 0
Необходимо разбить файл
    #36721477
Eugenkru10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dualshock2Задача такая формируется файл каждый раз в нем разное кол-во записей, необходимо разбить файл по 2000 записей. Т.е в одном файле не должно быть большее 2000 записей. Помогите никак не сображу как это сделать.
*Пример
DO WHILE !EOF()

SCAN NEXT 2000
*Операции над данными
ENDSCAN
IF !EOF()
SKIP
ENDIF

ENDDO
...
Рейтинг: 0 / 0
Необходимо разбить файл
    #36721495
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dualshock2Задача такая формируется файл каждый раз в нем разное кол-во записей, необходимо разбить файл по 2000 записей. Т.е в одном файле не должно быть большее 2000 записей. Помогите никак не сображу как это сделать.
Допустим, имеем результирующую таблицу (курсор) TABLE0, которую нужно разбить по 2000 записей. Тогда можно так:

SELECT TABLE0

NUMTABLES = CEILIUNG (RECC()/2000) && Считаем, солько у нас д/б файлов

FOR I1 = 1 TO NUMTABLES
GOTO (2000*(I1-1) + 1)
OBJ1 = 'TABLE' + TRANSFORM(I1,@T) && ИМЯ ОЧЕРЕДНОЙ ТАБЛИЦЫ типа TABLE1, TABLE2...
COPY NEXT 2000 TO &OBJ1
NEXT

Не проверял на Фоксе, т.к. пишу "на коленях". Идея должна быть понятна.
...
Рейтинг: 0 / 0
Необходимо разбить файл
    #36721519
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igorbik,
Сканы, селекты... Это всё замечательно. А не проще ли
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT OurTable
i= 1 
firstrec= 1 
lasttrec= 2000 
AllSteps=RECCOUNT("OurTable")/ 2000 
IF AllSteps-INT(AllSteps)> 0 
	AllSteps=INT(AllSteps)+ 1 
ENDIF
DO WHILE AllSteps<> 0  
   newname="NewTable"+alltrim(str(i))
   COPY TO &newname FOR RECNO()>=firstrec .AND. RECNO()<=lastrec
   firstrec=lastrec+ 1 
   lastrec=lastrec+ 2000 
   i=i+ 1 
   AllSteps=AllSteps- 1 	
ENDDO

Если я в деталях не ошибся. Образуется набор таблиц с именами NewTable1, NewTable2 и т.д. в каждой из которых по 2000 записей.
...
Рейтинг: 0 / 0
Необходимо разбить файл
    #36721544
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rewareigorbik,
Сканы, селекты... Это всё замечательно. А не проще ли

При условии, что нет записей, помеченных как удаленные. Впрочем, это легко обходится, если первый раз скопировать ВСЕ записи, а потом разбивать результат этого первого прогона
...
Рейтинг: 0 / 0
Необходимо разбить файл
    #36721549
dualshock2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем большое .
...
Рейтинг: 0 / 0
Необходимо разбить файл
    #36721649
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
При условии, что нет записей, помеченных как удаленные. Впрочем, это легко обходится, если первый раз скопировать ВСЕ записи, а потом разбивать результат этого первого прогона
Владимир всегда найдёт, за что зацепиться :)) Ну если ума хватает у программёра, так в COPY ... FOR добавить условие .AND. !DELETED().
...
Рейтинг: 0 / 0
Необходимо разбить файл
    #36721717
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следует заметить, что COPY TO в процессе своего выполнения автоматически перемещает указатель записи на последнюю скопированную запись. Поэтому, можно все сделать проще

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
* Начальное значение счетчика в имени новых таблиц
lnNextI =  0 

* Перед началом цикла надо переместится в начало таблицы-источника
select MyTab
go top

* Собственно цикл
do while EOF('MyTab') = .F.

	* Увеличиваем счетчик
	lnNextI = lnNextI +  1 

	* Формируем имя очередной таблицы
	lcFileName = 'Table' + transform(lnNextI) + '.dbf'

	* Собственно копирование очередных  2000  записей
	copy next  2000  to (m.lcFileName)

	* В этом месте указатель записи находится на последней скопированной записи
	* Надо переместится на первую не скопированную запись
	* Т.е. просто перейти на следующую запись
	skip
enddo

Как уже говорил, использование команды GO - не надежно из-за возможного наложения не явного фильтра по SET DELETED или явного SET FILTER по каким-либо другим критериям.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Необходимо разбить файл
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]