powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Чтение текстового файла
24 сообщений из 24, страница 1 из 1
Чтение текстового файла
    #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
Чтение текстового файла
    #33121149
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ух черт
а текстовый редактор не поможет ?
ну если не помежет то функции
fread fwrite fopen fseek например
есть другие способы
...
Рейтинг: 0 / 0
Чтение текстового файла
    #33121244
Akel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
leafух черт
а текстовый редактор не поможет ?

Это только часть огромного текстового файла, тем более каждый день он меняется...
Можно хоть какой примерчик чтения и копирования фрагментов текстового файлика?
...
Рейтинг: 0 / 0
Чтение текстового файла
    #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
Чтение текстового файла
    #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
Чтение текстового файла
    #33121277
Akel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программка сама не обращается и не имеет никакой БД, суть ее только одна это переделать текстовый файл из 1 варианта во 2 вариант, и все.
...
Рейтинг: 0 / 0
Чтение текстового файла
    #33121288
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да конечно дбф файл это таблица и никакого отношения к текстовому файлу не имеет ? Правильно я говорю? А с текстовым файлом низя работать как с таблицей ?
Если я прав тогда извените за розыгрыш с приведенным примером он абсолютно бесполезен.
А еще есть такая штука как командное окно фокспро. Это так к слову
...
Рейтинг: 0 / 0
Чтение текстового файла
    #33121295
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akel leafух черт
а текстовый редактор не поможет ?

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

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

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

P.S. Вы уж простите, но я что то на самом деле не пойму...
...
Рейтинг: 0 / 0
Чтение текстового файла
    #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
Чтение текстового файла
    #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
Чтение текстового файла
    #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
Чтение текстового файла
    #33121882
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы преобразовать, сначала позицию в строке найти надо. У тебя есть кАнкретный разделитель '#', вот его и ищи с помощью AT()
AT(cSearchExpression, cExpressionSearched [, nOccurrence]) - вот этот самый nOccurrence рулит, нужен пятый разделитель - задай сразу 5.
Еще подробнее разжевать?


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

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

n4=AT('#', txt ,4)
n5=AT('#', txt ,5)
n6=AT('#', txt ,6)
...
Рейтинг: 0 / 0
Чтение текстового файла
    #33121933
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глянь вот это обсуждение Форум Foxclub
...
Рейтинг: 0 / 0
Чтение текстового файла
    #33122027
ser57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.Попробуй использовать функцию FILETOSTR().
Сразу файл преобразуешь в переменную.
2. Если это программно сформированный файл, то у него наверняка на конце
каждой строки сидят chr(13)+chr(10), определил их позицию (через массив) - знаешь длину каждой строки.
3. Затем проводишь выборку из всего файла очередную строку -
в выбранной строке определяешь позиции #(пишешь в массив) ,
обрабатываешь и пишешь в новую переменную - будующий результат, и так далее - вообщим цикла в цикле, после окончания обработки STRTOFILE() из переменной в файл.
Извини пишу быстро - конец раб.дня
...
Рейтинг: 0 / 0
Чтение текстового файла
    #33122151
Akel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем огромное спасибо, сейчас буду во всем разбираться...
...
Рейтинг: 0 / 0
Чтение текстового файла
    #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
Чтение текстового файла
    #33122396
Akel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уффффф....РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ВСЕМ ОГРОМНОЕ СПАСИБО!!!!
...
Рейтинг: 0 / 0
Чтение текстового файла
    #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
Период между сообщениями больше года.
Чтение текстового файла
    #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
Чтение текстового файла
    #39082818
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость Хаттаба, думаешь проблема актуальна через 10 лет?

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


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