Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Чтение текстового файла / 24 сообщений из 24, страница 1 из 1
17.06.2005, 10:36
    #33121128
Akel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Суть задачи следующая:
Есть текстовый файл mo_imp.txt для импорта в программу, но его нужно поменять следющим образом:
Есть
Код: plaintext
1.
2.
# 25 # 17 . 06 . 05 
# 107 # 32302810700470010027 # 30302840100220000045 # 125 . 00 # 0 . 00 #разная инфа#
# 108 # 70204840744442987447 # 30302840100220000034 # 148 . 36 # 0 . 00 #разная инфа#

Надо
Код: plaintext
1.
2.
# 25 # 17 . 06 . 05 
# 107 # 32302810700470010027 # 30302840100220000045 # 125 . 00 # 125 . 00 #разная инфа#
# 108 # 70204840744442987447 # 30302840100220000034 # 148 . 36 # 148 . 36 #разная инфа#
...
Рейтинг: 0 / 0
17.06.2005, 10:42
    #33121149
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
ух черт
а текстовый редактор не поможет ?
ну если не помежет то функции
fread fwrite fopen fseek например
есть другие способы
...
Рейтинг: 0 / 0
17.06.2005, 11:11
    #33121244
Akel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
leafух черт
а текстовый редактор не поможет ?

Это только часть огромного текстового файла, тем более каждый день он меняется...
Можно хоть какой примерчик чтения и копирования фрагментов текстового файлика?
...
Рейтинг: 0 / 0
17.06.2005, 11:18
    #33121260
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
ну если вы пришлете примерчик чего вам надо то будет примерчик как делать

gg= fopen('d:\mydbf.dbf',2)
if gg>0
fseek(gg,29)
fwrite(gg.chr(0))
fclose(gg)
set cpdialog on
use d:\mydbf.dbf in 0 exclusive
endif

если ничего не напутал
...
Рейтинг: 0 / 0
17.06.2005, 11:19
    #33121262
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
gg= fopen('d:\mydbf.dbf',2)
if gg>0
fseek(gg,29)
fwrite(gg,chr(0))
fclose(gg)
set cpdialog on
use d:\mydbf.dbf in 0 exclusive
endif
...
Рейтинг: 0 / 0
17.06.2005, 11:24
    #33121277
Akel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Программка сама не обращается и не имеет никакой БД, суть ее только одна это переделать текстовый файл из 1 варианта во 2 вариант, и все.
...
Рейтинг: 0 / 0
17.06.2005, 11:28
    #33121288
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
да конечно дбф файл это таблица и никакого отношения к текстовому файлу не имеет ? Правильно я говорю? А с текстовым файлом низя работать как с таблицей ?
Если я прав тогда извените за розыгрыш с приведенным примером он абсолютно бесполезен.
А еще есть такая штука как командное окно фокспро. Это так к слову
...
Рейтинг: 0 / 0
17.06.2005, 11:31
    #33121295
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Akel leafух черт
а текстовый редактор не поможет ?

Это только часть огромного текстового файла, тем более каждый день он меняется...
Можно хоть какой примерчик чтения и копирования фрагментов текстового файлика?
А что тут сложного? Если ты хоть один раз работал с файлами на низком уровне (например, в бейсике, С, паскале...), то ничего нового нет - принципы те же самые:

- при помощи fopen (кстати, похожая функция есть в С) открывается файл; числовое значение, возвращаемое этой функцией, является идентификатором (Хендлом, handle ) открытого файла; если вернулось -1, то произошла ошибка при открытии.
- при помощи fread читаются ПОСЛЕДОВАТЕЛЬНО байты из файла (Столько, сколько нужно ) и помещаются в текстовую переменную.
- текстовая переменная дробится на фрагменты в соответствии с проставленными разделителями и фрагменты преобразуются к необходимому формату (число, дата, время и т.д.)
- производятся нужные преобразования
- фрагменты собираются в нужном порядке и при помощи fwrite записываются в файл (можно в тот же самый), а можно сразу закинуть данные в dbf-ки...
- когда достигнут конец исходного файла обработка останавливается, открытые на низком уровне файлы закрываются при помощи fclose(<Хэндл>)

Вот и все! А ты боялась...
...
Рейтинг: 0 / 0
17.06.2005, 11:38
    #33121319
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
AkelПрограммка сама не обращается и не имеет никакой БД, суть ее только одна это переделать текстовый файл из 1 варианта во 2 вариант, и все.
Я открою тебе страшную тайну: любой файл (dbf, dll, exe и т.д.) можно обработать как текстовый Неужели ты ни разу не нажимал в Нортон Командере (Тотал/Виндовс Командере или Фаре) F3/F4 не на текстовом файле? Ни за что не поверю...
...
Рейтинг: 0 / 0
17.06.2005, 11:54
    #33121377
Akel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
нажимал=)))
просто уже мозги кипят...
сразу по несколько дел делаешь, толком не могу со средоточится=)))
Буду пробовать, спасибки
...
Рейтинг: 0 / 0
17.06.2005, 13:12
    #33121711
Akel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Что то одного пока не пойму, как мне сделать, чтоб FOX после четвертого # начал копирование содержимого в переменую до пятого # . После чего с пятого # по шестой # вставил взамен тех данных что там есть. И перешел на следующую строчку и повторил аналогичное, и так все до конца файла.

P.S. Вы уж простите, но я что то на самом деле не пойму...
...
Рейтинг: 0 / 0
17.06.2005, 13:37
    #33121797
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
AkelЧто то одного пока не пойму, как мне сделать, чтоб FOX после четвертого # начал копирование содержимого в переменую до пятого # . После чего с пятого # по шестой # вставил взамен тех данных что там есть. И перешел на следующую строчку и повторил аналогичное, и так все до конца файла.

P.S. Вы уж простите, но я что то на самом деле не пойму...

Примерно так:
1 - определить текущую позицию в файле pp=fseek(handle,0,1)
2: - считать строку из файла в переменную:аа=fgets(<Параметры>)
3 - определить позицию пятого # (pos)
4 - определить позицию шестого # (pos1)
5 - сс=substr(aa,1,pos)
6 - bb=substr(aa,pos+1,pos1-1)
7 - dd=substr(aa,pos1)
8 - преобразуем bb к числовому виду, проведем преобразования, затем вернем числовое значение к текстовому виду и сохраним его в bb
9 - aa=cc+bb+dd
10 - fseek(handle,pp,0)

* Это если писать в тот же файл; если писать в другой, то просто пишем в
* конец файла, а п.10 пропускаем...

11 - fputs(handle,aa) или fwrite(....)
12 - go to label 2:
...
Рейтинг: 0 / 0
17.06.2005, 13:51
    #33121840
Данилов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Есть такие полезные функции - FGETS() и FPUTS(), описание найдешь в хелпе твоей версии, из этого же семейства.
Они чишут/пишут не кол-во байт, а построчно, то есть до CR+LF. Юзаешь их вместо FREAD/FWRITE.
Получил строку - преобразовал - отписал в другой файл, сделанный тобой предварительно по FCREATE().
Чтобы преобразовать, сначала позицию в строке найти надо. У тебя есть кАнкретный разделитель '#', вот его и ищи с помощью AT()
AT(cSearchExpression, cExpressionSearched [, nOccurrence]) - вот этот самый nOccurrence рулит, нужен пятый разделитель - задай сразу 5.
Еще подробнее разжевать?
Не забудь FCLOSE() для обоих файлов, чтения и записи. Если результирующий файл должен сохранить прежнее имя, то (1) переименуй исходный, (2) переименуй полученный.
А вообще-то такие вещи, как замена "неправильных" данных на правильные, решается одним-двумя Update-SQL уже после того, как ты эти файлы зальёшь в базу. И стоит ли городить огород из FOPEN/FCREATE/FGETS/FPUTS/FCLOSE/RENAME?..
...
Рейтинг: 0 / 0
17.06.2005, 13:53
    #33121848
Новоселов Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Hi Akel

По видимому это файл для обмена с РКЦ.

Можно поступить так создать табличку с 2-мя текстовыми полями
(если максимальная длина строки больше 254, то 4 поля)

или использовать
Код: 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.
&& пример на макс.длину > 254 
txt=space( 254 )
SELECT txt AS txt1_1, txt AS txt1_2, ;
  txt AS txt2_1, txt AS txt2_2 FROM любой dbf файл ;
  WHERE .F. INTO CURSOR aa READWRITE

SELECT aa
APPEND FROM mo_imp.txt SDF as  866 

GO TOP
do while !eof()
  txt=txt1_1+txt1_2

  n4=AT('#',txt1, 4 )
  n5=AT('#',txt1, 5 )
  n6=AT('#',txt1, 6 )

  IF n4> 0  AND n5> 0  AND n6> 0 
    nn=substr(txt,n4+ 1 ,n5-n4 -  1 )
    txt=substr(txt, 1 ,n5) + nn + substr(txt,n6)  && не указана длина - до конца строки

    replace txt2_1 with substr(txt, 1 , 254 )
    replace txt2_2 with substr(txt, 255 , 254 )
  ELSE
    replace txt2_1 with txt1_1, txt2_2 with txt1_2
  ENDIF

  SKIP
enddo

GO TOP
COPY TO mo_out.txt FIELDS txt2_1, txt2_2 SDF AS  866 
...
Рейтинг: 0 / 0
17.06.2005, 14:03
    #33121882
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Чтобы преобразовать, сначала позицию в строке найти надо. У тебя есть кАнкретный разделитель '#', вот его и ищи с помощью AT()
AT(cSearchExpression, cExpressionSearched [, nOccurrence]) - вот этот самый nOccurrence рулит, нужен пятый разделитель - задай сразу 5.
Еще подробнее разжевать?


А еще есть такая либа как foxtools, а в ней такие функции как Words и Wordnum (начиная с 7-ки или 8-ки они переместились в сам фокс под названиями GetWordCount и GetWordNum соответственно). И тогда получение нужного слова, напрмер 3-го, превращается в такую строчку:
lcWord = GetWordNum(строка_считанная_из_файла, 3, '#')

И дешево и сердито.
...
Рейтинг: 0 / 0
17.06.2005, 14:06
    #33121893
Новоселов Олег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
I'm sorry ... Опечатка;)

n4=AT('#', txt ,4)
n5=AT('#', txt ,5)
n6=AT('#', txt ,6)
...
Рейтинг: 0 / 0
17.06.2005, 14:17
    #33121933
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Глянь вот это обсуждение Форум Foxclub
...
Рейтинг: 0 / 0
17.06.2005, 14:45
    #33122027
ser57
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
1.Попробуй использовать функцию FILETOSTR().
Сразу файл преобразуешь в переменную.
2. Если это программно сформированный файл, то у него наверняка на конце
каждой строки сидят chr(13)+chr(10), определил их позицию (через массив) - знаешь длину каждой строки.
3. Затем проводишь выборку из всего файла очередную строку -
в выбранной строке определяешь позиции #(пишешь в массив) ,
обрабатываешь и пишешь в новую переменную - будующий результат, и так далее - вообщим цикла в цикле, после окончания обработки STRTOFILE() из переменной в файл.
Извини пишу быстро - конец раб.дня
...
Рейтинг: 0 / 0
17.06.2005, 15:27
    #33122151
Akel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Всем огромное спасибо, сейчас буду во всем разбираться...
...
Рейтинг: 0 / 0
17.06.2005, 16:46
    #33122376
Akel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Вообщем примерно так у меня получилось, и соответсвено ничего не работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CLEAR
STORE FOPEN('c:\text\1.txt') TO text1 
STORE FCREATE('c:\text\2.txt') TO text2
fseek(text1, 0 , 1 )
DO WHILE .T.
IF FEOF(text1)
exit
ENDIF
aa=fgets(text1)
n4=AT('#',aa, 4 )
n5=AT('#',aa, 5 )
n6=AT('#',aa, 6 )
nn=substr(aa,n4+ 1 ,n5-n4- 1 )
aa=substr(aa, 1 ,n5) + cc + substr(aa,n6)
FPUTS(text2,aa)
ENDDO

FCLOSE(text2)
FCLOSE(text1) 
Посмотрите плиз. Что не так?
...
Рейтинг: 0 / 0
17.06.2005, 16:55
    #33122396
Akel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Уффффф....РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ВСЕМ ОГРОМНОЕ СПАСИБО!!!!
...
Рейтинг: 0 / 0
17.06.2005, 17:00
    #33122410
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
STORE FOPEN('c:\text\1.txt') TO text1
STORE FCREATE('c:\text\2.txt') TO text2
if text1>0 and text2>0
DO WHILE !feof('text1')
aa=fgets(text1)
n5=AT('#',aa,5)
n6=AT('#',aa,6)
if n5>0 and n6>0
aa=left(aa,n5)+cc+substr(aa,n6)
endif
FPUTS(text2,aa)
ENDDO
else
messagebox('Закрыто приходите после часу')
endif
FCLOSE(text2)
FCLOSE(text1)
Как получилось так получилось
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.10.2015, 17:28
    #39082721
Чтение текстового файла
Как вариант

CREATE CURSOR Contents (Content M)
APPEND BLANK
APPEND MEMO Contents.Content FROM MyFile.txt

Содержимое мемо-поля, с точки зрения FoxPro, это обычная символьная строка.
Правда, очень большая. Т.е. в ней можно выполнять поиск обычными командами
строкового поиска AT().

Далее так же как и с Modify Program

MODIFY MEMO Contents.Content RANGE <expN1>, <expN2>

При желании, можно сбросить внесенные изменения обратно в файл командой

COPY MEMO Contents.Content TO MyFile.txt
...
Рейтинг: 0 / 0
21.10.2015, 19:15
    #39082818
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение текстового файла
Гость Хаттаба, думаешь проблема актуальна через 10 лет?

PS Смотри на даты, не занимайся некропостингом.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Чтение текстового файла / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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