powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Интересная задачка (txt в dbf)
4 сообщений из 4, страница 1 из 1
Интересная задачка (txt в dbf)
    #34122724
Школяр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Вот какая задачка.
Есть текстовые файлы
данного вида:

********************
ГодПериодОтч:2005
ДокПредст:
ОКЕИ:383
КолПокФОтч:17
###
ОКАТО:22247501000
###
КБК:18210202020061000160
СумПл1:4116
СумПл2:3463
СумПл3:3431
###
КБК:18210202010061000160
СумПл1:22610
СумПл2:21085
СумПл3:33151
###
********************
Необходимо его закачать в dbf
Делал так:

...
g_p_ot = 'ГодПериодОтч'
doc_p = 'ДокПредст'
okey = 'ОКЕИ'
p_f_ot = 'КолПокФОтч'
okato = 'ОКАТО'

IF FILE('fns.dbf')
DELETE FILE fns.dbf
endif

IF FILE('temp.dbf')
DELETE FILE temp.dbf
endif

CREATE TABLE fns (g_p_ot c(4), doc_p c(4), okey c(4), p_f_ot c(3), okato c(13), kbk_s c(20), kbk_n c(20))
create table temp (line c(130))
=adir(aFiles,"*.023")
rt=alen(aFiles,1)
for ss=1 to rt
append from &aFiles(ss,1) TYPE SDF as 866
ENDFOR

SELECT temp
go top

scan

d = line
e = AT(":", d)
e2 = SUBSTR(d, 1, e-1)
e3 = AT(' ', d)
e4 = SUBSTR(d, e+1, e3-1)
e5 = SUBSTR(d, e+1)
SELECT temp

IF e <> 0 AND g_p_ot = e2
SELECT fns
replace g_p_ot WITH e4
ENDIF

SELECT temp

IF e <> 0 AND doc_p = e2
SELECT fns
replace doc_p WITH e4
ENDIF

SELECT temp

IF e <> 0 AND okey = e2
SELECT fns
replace okey WITH e4
ENDIF

SELECT temp

IF e <> 0 AND p_f_ot = e2
SELECT fns
replace p_f_ot WITH e4
ENDIF

SELECT temp

IF e <> 0 AND okato = e2
SELECT fns
replace okato WITH e4
ENDIF

SELECT temp

IF e <> 0 AND kbk = e2
SELECT fns
replace kbk_s WITH e4
ENDIF

endscan

И тут я сел :((
Данные повторяются.
*****
КБК:
СумПл1:
СумПл2:
СумПл3:
*****
Помогите подскажите -
в каком направлении шагать.
Сильно не пинайте - только учусь.
...
Рейтинг: 0 / 0
Интересная задачка (txt в dbf)
    #34122952
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Копай в сторону функций работы с файлами FOPEN(), FGETS()
примерно так
Код: 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.
25.
26.
create cursor tclinfo (nClId i, cLogin c( 30 ), cInfo c( 50 ), nKoef n( 10 ,  6 ), lSend l)
lnF = fopen('tmp\clients.txt')
if lnF <  0 
	ToLog('!!! Не удалось открыть файл tmp\clients.txt')
	llOk = .f.
else
	lnClId =  0 
	lcLogin = ''
	do while !feof(lnF)
		lcS = fgets(lnF)
		if lcS = '[Client]'
			if !empty(lcLogin)
				append blank in tClInfo
				repl in tClInfo nClId with lnClId, cLogin with lcLogin
			endif
			lnClId =  0 
			lcLogin = ''
		else
			if left(lcS,  6 ) = 'Login:'
				lcLogin = alltrim(substr(lcS,  7 ))
			endif
			if left(lcS,  12 ) = 'Код клиента:'
				lnClId = val(substr(lcS,  13 ))
			endif
		endif
	enddo
endif
Это для файла типа: Исходный файл[Client]
Login: tyuty
Client: ftytyurtyury
Address:
Phone:
[Client]
Login: test
Client: test
Address:
Phone: 123456
Код клиента: 441924
[Client]
Login: admin
Client: Администратор
Address:
Phone:
...
Рейтинг: 0 / 0
Интересная задачка (txt в dbf)
    #34124284
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле: как обработать повторяющиеся блоки строк?

Ну, так у тебя же есть признак, что строка символов "###" - это конец очередного блока информации, а какой именно это будет блок зависит от начала текста следующей строки.

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
* Сначала определяем константы

#DEFINE BLOCK_END "###"

#DEFINE LINE_YEAR "ГодПериодОтч:"
#DEFINE LINE_DOC "ДокПредст:"
#DEFINE LINE_OKEI "ОКЕИ:"
#DEFINE LINE_QTY "КолПокФОтч:"
#DEFINE LINE_OKATO "ОКАТО:"

#DEFINE LINE_KBK "КБК:"
#DEFINE LINE_SUM_1 "СумПл1:"
#DEFINE LINE_SUM_2 "СумПл2:"
#DEFINE LINE_SUM_3 "СумПл3:"

* Таблица заголовка
IF FILE('fns.dbf')
	DELETE FILE fns.dbf
endif 

* Поле fns_id - это идентификатор записи
CREATE TABLE fns (fns_id n( 10 ), ;
		g_p_ot c( 4 ), ;
		doc_p c( 4 ), ;
		okey c( 4 ), ;
		p_f_ot c( 3 ), ;
		okato c( 13 ), ;
		kbk_s c( 20 ), ;
		kbk_n c( 20 ) )

* Таблица платежей
IF FILE('platezh.dbf')
	DELETE FILE platezh.dbf
endif 

CREATE TABLE platezh (fns_id n( 10 ), ;
		kbk c( 20 ), ;
		platezh1 n( 13 , 2 ), ;
		platezh2 n( 13 , 2 ), ;
		platezh3 n( 13 , 2 ) )

* Временная таблица с содержимым текстового файла
create cursor temp (line c( 130 ))

* Наполняем временную таблицу
LOCAL laFiels( 1 ), lnNextFile, lcFileName
rt=adir(laFiels,"*.023") 
for lnNextFile= 1  to m.rt
	lcFileName = laFiels[m.lnNextFile, 1 ]
	append from (m.lcFileName) TYPE SDF as  866 
ENDFOR

* Переменная, которая содержит признак того, 
* что текущая строка - это первая строка нового блока
LOCAL llFirstLine
llFirstLine = .T.

* Сравнение строк осуществляем до истечения символов в более короткой строке
SET EXACT OFF

* Сканируем таблицу 
select temp
SCAN

* Проверяем, что текущая строка - это конец блока
IF temp.line = BLOCK_END
	* Следующая строка, будет первой строкой нового блока
	llFirstLine = .T.
	* Больше с данной строкой делать нечего. Берем следующую
	LOOP
ENDIF

* Если данная строка - это начало нового блока, то, 
* возможно, надо создать новую строку
IF m.llFirstLine = .T.
	DO CASE
	* Новая строка заголовка
	CASE InList(temp.line, LINE_YEAR, LINE_DOC, LINE_OKEI, LINE_QTY) 
		select fns 
		append blank
		* Здесь надо сформировать код записи новой строки
		* Пока просто присваиваю физический номер записи
		* хотя это не очень хорошо
		replace fns_id with Recno()
	* Это НЕ новая строка, а продолжение старой
	CASE temp.line = LINE_OKATO
		* Ничего не делаем
	* Новая строка платежей
	CASE InList(temp.line, LINE_KBK, LINE_SUM_1, LINE_SUM_2, LINE_SUM_3)
		select platezh
		append blank
		replace fns_id with fns.fns_id
	ENDCASE
	* Сбрасываю признак новой строки
	m.llFirstLine = .F.
ENDIF

* Теперь собственно запись информации в соответсвующие поля
DO CASE
CASE temp.line = LINE_YEAR
	select fns
	replace g_p_ot with strTran(temp.line,LINE_YEAR,"")
CASE temp.line = LINE_DOC
	select fns
	replace doc_p with strTran(temp.line,LINE_DOC,"")
CASE temp.line = LINE_OKEI
	select fns
	replace okey with strTran(temp.line,LINE_OKEI,"")
CASE temp.line = LINE_QTY
	select fns
	replace p_f_ot with strTran(temp.line,LINE_QTY,"")
CASE temp.line = LINE_OKATO
	select fns
	replace okato with strTran(temp.line,LINE_OKATO,"")
CASE temp.line = LINE_KBK
	select platezh
	replace kbk with strTran(temp.line,LINE_KBK,"")
CASE temp.line = LINE_SUM_1
	select platezh
	replace platezh1 with val(strTran(temp.line,LINE_SUM_1,""))
CASE temp.line = LINE_SUM_2
	select platezh
	replace platezh2 with val(strTran(temp.line,LINE_SUM_2,""))
CASE temp.line = LINE_SUM_3
	select platezh
	replace platezh3 with val(strTran(temp.line,LINE_SUM_3,""))
ENDCASE


ENDSCAN

В данном случае формируются 2 связанные таблицы: заголвок и платежи. Но можешь все впихнуть и в одну
...
Рейтинг: 0 / 0
Интересная задачка (txt в dbf)
    #34125413
Школяр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо.

Особенно ВладимирМ.
Так подробно. Даже не надеялся.
Еще раз спасибо.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Интересная задачка (txt в dbf)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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