Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Еще раз про txt-dbf / 19 сообщений из 19, страница 1 из 1
05.10.2005, 10:45:44
    #33305502
Denver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
Как программно перенести данные из текстового файла в dbf? Не прибегая к помощи мастера? Работаю на VFP 5.0.
Примерное содержание текстового файлика:
G444592,1,10011,3,,,,,,,608.59,4.91,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,613.5
G444591,1,5608,3,,,,,,,153.76,1.24,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,155
G444593,1,10152,3,,,,,,,478.26,11.76,02/08/05,002,440008,,,,,,,,,,,,,,,,,,198908,490.02
и т.д.

Заранее благодарен.
...
Рейтинг: 0 / 0
05.10.2005, 10:53:14
    #33305529
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
почитай

APPEND FROM FileName | ?[FIELDS FieldList] [FOR lExpression]
[[TYPE] [DELIMITED [WITH Delimiter | WITH BLANK | WITH TAB
| WITH CHARACTER Delimiter] | DIF | FW2 | MOD | PDOX | RPD |
SDF | SYLK | WK1 | WK3 | WKS | WR1 | WRK | CSV | XLS | XL5
[SHEET cSheetName] | XL8 [SHEET cSheetName]]] [AS nCodePage]
...
Рейтинг: 0 / 0
05.10.2005, 10:54:35
    #33305539
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
DenverКак программно перенести данные из текстового файла в dbf? Не прибегая к помощи мастера? Работаю на VFP 5.0.
Примерное содержание текстового файлика:
G444592,1,10011,3,,,,,,,608.59,4.91,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,613.5
G444591,1,5608,3,,,,,,,153.76,1.24,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,155
G444593,1,10152,3,,,,,,,478.26,11.76,02/08/05,002,440008,,,,,,,,,,,,,,,,,,198908,490.02
и т.д.

Заранее благодарен.
Как-как! Написать программу и запустить ее...
Короче:
1. Открыть текстовый файл через fopen
2. Считать одну строку в переменную (при помощи fgets)
3. Распарсить строку на отдельные составляющие (ведь запятая = разделитель полей), которые поместить в соответствующие переменные
4. В dbf файл добавить запись посредством insert into..., где в value(...) будут стоять имена переменных.
5. Повторять п.п. 2-4 до достижения конца текстового файла...
6. Все открытое закрыть :)

Только есть свои "НО":
1. порядок следования данных в текстовом файле должен строго соблюдаться.
2. Вкачать текстовой файл произвольного формата не получится. Надо каждый раз (для каждого нового порядка следования данных) "изобретать велосипед"
...
Рейтинг: 0 / 0
05.10.2005, 10:59:18
    #33305561
SAM-FoxPro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Local ln_Nfile, lcPathToFile ... 
ln_Nfile= FOPEN(lcPathToFile , 10 )  && If so, open read only 
IF ln_Nfile<  0   && Check for error opening file 
   =MESSAGEBOX('Невозможно открыть файл'+' '+lcPathToFile+'!', 16 ) 
ELSE  && If no error, read file 
   IF MESSAGEBOX('Будет обработан файл'+' '+lcPathToFile+'!', 33 ,'Продолжить?')= 1  
      DO  while  !Feof(ln_nfile) 
        lcStr=fgets(ln_nfile) 
        lc1=GETWORDNUM(lcStr, 1 ,',') 
        lc2=GETWORDNUM(lcStr, 2 ,',') 
        lc3=GETWORDNUM(lcStr, 3 ,',') 

и так далее 
       
        INSERT INTO <TableName> (<Field1>,<Field2>,<Field3>, ...) VALUES (lc1,lc2,lc3,...) 
       
      ENDDO       
   ENDIF 
FCLOSE(ln_nfile) 
ENDIF

в пятом нету GETWORDNUM(lcStr,1,',') .
Тогда:

Код: 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.
LOCAL lcStr,lnLenStr, lnPosit,lnCol 
DIMENSION acStr( 99 ) && сколько надо 
STORE '' TO acStr 

lnCol= 1  
lnPosit= 1  
i= 1  

* Естественно, следующая строка принимается из файла аналогично 
* предыдущему примеру 


lcStr='G444592,1,10011,3,,,,,,,608.59,4.91,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,613.5' 

lnLenStr=LEN(lcStr) 

DO while i < lnLenStr 
   IF SUBSTR(lcStr,i, 1 )==',' 
      acStr(lnCol)=SUBSTR(lcStr,lnPosit,i-lnPosit) 
      lnCol=lnCol+ 1  
      i=i+ 1  
      lnPosit=i 
   ELSE 
      i=i+ 1  
   ENDIF 
ENDDO     
acStr(lnCol)=SUBSTR(lcStr,lnPosit,i-lnPosit+ 1 )

Т.о. в массиве будут соответствующие фрагменты строки
...
Рейтинг: 0 / 0
05.10.2005, 11:35:54
    #33305757
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
на функцию
возвращает из строки с разделителем-запятая элементы
********************************************

para номер_элемента,символьная_строка
retu_строка=''
do case
case номер_элемента=1
retu subs(символьная_строка,1,at(',',символьная_строка)-1)
othe
начальная_позиция=at(',',символьная_строка,номер_элемента-1)
конечная_позиция =at(',',символьная_строка,номер_элемента)
do case
case начальная_позиция=0
retu ''
case конечная_позиция=0
on erro true=.f.
retu_строка=subs(символьная_строка,начальная_позиция+1)
on erro
if empt(retu_строка)
retu_строка=''
endif
retu retu_строка
othe
on erro true=.f.
retu_строка=subs(символьная_строка,начальная_позиция+1,конечная_позиция-начальная_позиция-1)
on erro
if empt(retu_строка)
retu_строка=''
endif
retu retu_строка
endcase
endcase


как страшно жить,
посмотрю иногда , ну как навернут- блин бедная фокса


если аппенд не хочешь,
никого не слушай
делай так

считай filetostr
и затем в цикле построчно функцией выдергивай
и в таблицу поченное реплейсь
...
Рейтинг: 0 / 0
05.10.2005, 12:31:21
    #33306001
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
alex11100на функцию
возвращает из строки с разделителем-запятая элементы
********************************************
как страшно жить,
посмотрю иногда , ну как навернут- блин бедная фокса

Действительно, настолько усложнить себе жизнь, это надо постараться


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
* Функция возвращает фрагмент из строки вида "1,2,3,4" по его порядковому номеру
* Под фрагментом, понимается часть строки обрамленная запятыми

FUNCTION Elements(tcString, tcNum)
LOCAL lcSeparator
lcSeparator = ","

LOCAL lcString, lnStartPos, lnEndPos
lcString   = m.lcSeparator+m.tcString+m.lcSeparator
lnStartPos = AT(m.lcSeparator,m.lcString,m.tcNum)
lnEndPos   = AT(m.lcSeparator,m.lcString,m.tcNum+ 1 )

RETURN SubStr(m.lcString,m.lnStartPos+ 1 ,m.lnEndPos-m.lnStartPos- 1 )

Пример вызова

Код: plaintext
?Elements("Первый фрагмент,Второй фрагмент,,,Пятый фрагмент", 5 )

При желании, можно добавить в качестве третьего параметра собственно символ-разделитель (значение lcSeparator)
...
Рейтинг: 0 / 0
05.10.2005, 12:36:11
    #33306016
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
я про аппенд
там все есть нафиг файл дергать
у него все с разделителями - лучше не бывает
...
Рейтинг: 0 / 0
05.10.2005, 12:43:08
    #33306038
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
alex11100я про аппенд
там все есть нафиг файл дергать
у него все с разделителями - лучше не бывает
Да, самое разумное и простое - это APPEND FROM. Одной командой закачивается вся информация одновременно распределясь по полям.

PS: функция FileToStr() появилась только в VFP6. В 5 ее не было (точнее, надо покопаться в FoxTools.fll, кажется, там уже была). Нужны другие способы получения строки (Memo-поле, FGETS())
...
Рейтинг: 0 / 0
05.10.2005, 12:45:14
    #33306052
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
DenverКак программно перенести данные из текстового файла в dbf? Не прибегая к помощи мастера? Работаю на VFP 5.0.
Примерное содержание текстового файлика:
G444592,1,10011,3,,,,,,,608.59,4.91,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,613.5
G444591,1,5608,3,,,,,,,153.76,1.24,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,155
G444593,1,10152,3,,,,,,,478.26,11.76,02/08/05,002,440008,,,,,,,,,,,,,,,,,,198908,490.02
и т.д.
Заранее благодарен.

Как советовал alex11100 почитай и обрати внимание на
DELIMITED
Указывает, что файл-источник, из которого записи добавляются в текущую таблицу Visual FoxPro, является файлом с разделителями. Файл с разделителями - это текстовый ASCII-файл, в котором каждая запись заканчивается возвратом каретки и переводом строки. По умолчанию предполагается, что значения полей отделены друг от друга запятыми и символьные значения заключены в кавычки. Например:
"Smith", 9999999, "TELEPHONE"
А после этого и применяй эту команду.
Или
1. Либо структуру таблицы в которую нужно записать приложи в топик.
2. Читай и внедряй другие советы.
3. Вообще надо как-то самому пробовать изобретать что-то. Это гораздо полезнее, если хочешь научиться программировать.
А может это у тебя разовая работа, и больше никогда не вернешься к FOXу???
...
Рейтинг: 0 / 0
05.10.2005, 13:10:30
    #33306132
Denver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
alex11100почитай

APPEND FROM FileName | ?[FIELDS FieldList] [FOR lExpression]
[[TYPE] [DELIMITED [WITH Delimiter | WITH BLANK | WITH TAB
| WITH CHARACTER Delimiter] | DIF | FW2 | MOD | PDOX | RPD |
SDF | SYLK | WK1 | WK3 | WKS | WR1 | WRK | CSV | XLS | XL5
[SHEET cSheetName] | XL8 [SHEET cSheetName]]] [AS nCodePage]

DIF | FW2 | MOD | PDOX | RPD |
SDF | SYLK | WK1 | WK3 | WKS | WR1 | WRK | CSV | XLS | XL5
Это как я понимаю типы файлов. А txt к какому из них относится?
...
Рейтинг: 0 / 0
05.10.2005, 13:17:35
    #33306157
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
SDF

Задайте SDF, чтобы импортировать данные из файла System Data Format. Файл SDF ѕ это текстовый ASCII-файл, в котором записи имеют фиксированную длину и заканчиваются возвратом каретки и переводом строки. Предполагается, что файлы SDF имеют расширение имени .TXT.
...
Рейтинг: 0 / 0
05.10.2005, 13:19:35
    #33306167
Denver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
Владимир СА DenverКак программно перенести данные из текстового файла в dbf? Не прибегая к помощи мастера? Работаю на VFP 5.0.
Примерное содержание текстового файлика:
G444592,1,10011,3,,,,,,,608.59,4.91,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,613.5
G444591,1,5608,3,,,,,,,153.76,1.24,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,155
G444593,1,10152,3,,,,,,,478.26,11.76,02/08/05,002,440008,,,,,,,,,,,,,,,,,,198908,490.02
и т.д.
Заранее благодарен.

Как советовал alex11100 почитай и обрати внимание на
DELIMITED
Указывает, что файл-источник, из которого записи добавляются в текущую таблицу Visual FoxPro, является файлом с разделителями. Файл с разделителями - это текстовый ASCII-файл, в котором каждая запись заканчивается возвратом каретки и переводом строки. По умолчанию предполагается, что значения полей отделены друг от друга запятыми и символьные значения заключены в кавычки. Например:
"Smith", 9999999, "TELEPHONE"
А после этого и применяй эту команду.
Или
1. Либо структуру таблицы в которую нужно записать приложи в топик.
2. Читай и внедряй другие советы.
3. Вообще надо как-то самому пробовать изобретать что-то. Это гораздо полезнее, если хочешь научиться программировать.
А может это у тебя разовая работа, и больше никогда не вернешься к FOXу???

Да нет работа не разовая и очень интересная, просто с фоксом знаком 2 месяца всего.

А вот насчет структуры... мне необходимо просто перегнать txt в dbf , поэтому структура будет как и сам текстовый файлик.
...
Рейтинг: 0 / 0
05.10.2005, 13:20:47
    #33306170
Denver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
PaulWist SDF

Задайте SDF, чтобы импортировать данные из файла System Data Format. Файл SDF ѕ это текстовый ASCII-файл, в котором записи имеют фиксированную длину и заканчиваются возвратом каретки и переводом строки. Предполагается, что файлы SDF имеют расширение имени .TXT.

Огромное спасибо за подсказку.
...
Рейтинг: 0 / 0
05.10.2005, 13:21:11
    #33306174
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
DenverА txt к какому из них относится?
Он по другому задается. Факт наличия ключевого слова DELIMITED и является тем признаком, который указывает, что информация берется из текстового файла.

В твоем случае надо дать команду

Код: plaintext
1.
2.
SELECT MyTable
APPEND FROM MyFile.txt DELIMITED

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

Конвертация типов данных произойдет автоматически, если это возможно. Если это по каким-либо причинам конвертация в нужный тип данных невозможна, то будет сформировано пустое или нулевое значение для данного поля.
...
Рейтинг: 0 / 0
05.10.2005, 13:40:15
    #33306235
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
ну слава...,
пришли к консенсусу ,
шалю я сегодня
вчера хенеси попил старого
пока не ругнешься - не пониме
...
Рейтинг: 0 / 0
05.10.2005, 13:51:49
    #33306276
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
Denver PaulWist SDF

Задайте SDF, чтобы импортировать данные из файла System Data Format. Файл SDF ѕ это текстовый ASCII-файл, в котором записи имеют фиксированную длину и заканчиваются возвратом каретки и переводом строки. Предполагается, что файлы SDF имеют расширение имени .TXT.

Огромное спасибо за подсказку.
Только надо быть крайне внимательным! В приведенном фрагменте файла
автор
G444592,1,10011,3,,,,,,,608.59,4.91,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,613.5
G444591,1,5608,3,,,,,,,153.76,1.24,02/08/05,001,05211,,,,,,,,,,,,,,,,,,198907,155
G444593,1,10152,3,,,,,,,478.26,11.76,02/08/05,002,440008,,,,,,,,,,,,,,,,,,198908,490.02

этого (одинаковой длины строк) не наблюдается... Хотя, могут быть пробелы на концах...
Поэтому надежнее - все-таки закачка "под контролем" с выделением отдельных значений из строки, явными преобразованиями и т.д...
...
Рейтинг: 0 / 0
05.10.2005, 13:58:44
    #33306295
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
Hi, Denver !
Т.к. ты не прислал структуру таблицы, пришлось сделать самому:
Код: 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.
Structure for table: WR_01.DBF
Number of data records:        3        
Date of last update:           05 / 10 / 05 
 Code Page:                    1251     
   Field Name Type       Width
  1  P1         Character   10 
  2  P2         Numeric     10 
  3  P3         Numeric     10 
  4  P4         Numeric     10 
  5  P5         Character   1  
  6  P6         Character   1  
  7  P7         Character   1  
  8  P8         Character   1  
  9  P9         Character   1  
 10  P10        Character   1  
 11  P11        Numeric     12 . 2 
 12  P12        Numeric     12 . 2 
 13  P13        Date        8  
 14  P14        Character   3  
 15  P15        Character   10 
 16  P16        Character   1  
 17  P17        Character   1  
 18  P18        Character   1  
 19  P19        Character   1  
 20  P20        Character   1  
 21  P21        Character   1  
 22  P22        Character   1  
 23  P23        Character   1  
 24  P24        Character   1  
 25  P25        Character   1  
 26  P26        Character   1  
 27  P27        Character   1  
 28  P28        Character   1  
 29  P29        Character   1  
 30  P30        Character   1  
 31  P31        Character   1  
 32  P32        Character   1  
 33  P33        Numeric     10 
 34  P34        Numeric     12 . 2 
** Total **    131 
Теперь команда:
Код: plaintext
APPEND FROM data.txt TYPE DELIMITED
Где содержимое файла data.txt:
Код: plaintext
1.
2.
G444592, 1 , 10011 , 3 ,,,,,,, 608 . 59 , 4 . 91 , 02 / 08 / 05 , 001 , 05211 ,,,,,,,,,,,,,,,,,, 198907 , 613 . 5 
G444591, 1 , 5608 , 3 ,,,,,,, 153 . 76 , 1 . 24 , 02 / 08 / 05 , 001 , 05211 ,,,,,,,,,,,,,,,,,, 198907 , 155 
G444593, 1 , 10152 , 3 ,,,,,,, 478 . 26 , 11 . 76 , 02 / 08 / 05 , 002 , 440008 ,,,,,,,,,,,,,,,,,, 198908 , 490 . 02 
И вот результат:
...
Рейтинг: 0 / 0
05.10.2005, 13:59:09
    #33306296
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
длина - побарабану,
главное колич-во запятых в строке
тяни аппендом, затем меняй структуру его и сливай куда нужно
...
Рейтинг: 0 / 0
05.10.2005, 14:41:57
    #33306465
Denver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз про txt-dbf
Владимир САHi, Denver !
Т.к. ты не прислал структуру таблицы, пришлось сделать самому:
Код: 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.
Structure for table: WR_01.DBF
Number of data records:        3        
Date of last update:           05 / 10 / 05 
 Code Page:                    1251     
   Field Name Type       Width
  1  P1         Character   10 
  2  P2         Numeric     10 
  3  P3         Numeric     10 
  4  P4         Numeric     10 
  5  P5         Character   1  
  6  P6         Character   1  
  7  P7         Character   1  
  8  P8         Character   1  
  9  P9         Character   1  
 10  P10        Character   1  
 11  P11        Numeric     12 . 2 
 12  P12        Numeric     12 . 2 
 13  P13        Date        8  
 14  P14        Character   3  
 15  P15        Character   10 
 16  P16        Character   1  
 17  P17        Character   1  
 18  P18        Character   1  
 19  P19        Character   1  
 20  P20        Character   1  
 21  P21        Character   1  
 22  P22        Character   1  
 23  P23        Character   1  
 24  P24        Character   1  
 25  P25        Character   1  
 26  P26        Character   1  
 27  P27        Character   1  
 28  P28        Character   1  
 29  P29        Character   1  
 30  P30        Character   1  
 31  P31        Character   1  
 32  P32        Character   1  
 33  P33        Numeric     10 
 34  P34        Numeric     12 . 2 
** Total **    131 
Теперь команда:
Код: plaintext
APPEND FROM data.txt TYPE DELIMITED
Где содержимое файла data.txt:
Код: plaintext
1.
2.
G444592, 1 , 10011 , 3 ,,,,,,, 608 . 59 , 4 . 91 , 02 / 08 / 05 , 001 , 05211 ,,,,,,,,,,,,,,,,,, 198907 , 613 . 5 
G444591, 1 , 5608 , 3 ,,,,,,, 153 . 76 , 1 . 24 , 02 / 08 / 05 , 001 , 05211 ,,,,,,,,,,,,,,,,,, 198907 , 155 
G444593, 1 , 10152 , 3 ,,,,,,, 478 . 26 , 11 . 76 , 02 / 08 / 05 , 002 , 440008 ,,,,,,,,,,,,,,,,,, 198908 , 490 . 02 
И вот результат:

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


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