Работа с текстовым файлов как с строкой
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1379
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Работа с текстовым файлов как с строкой
У меня была задачка по работе с текстовым файлом, и там файлы как раз могли встречаться с разными вариантами конца строки, делал примерно так - грузим сначала файл в строку, делаем поиск <13,10>, если что-то нашли значит это "виндовый" формат, шлем в драйвер "EOF=2,13,10", переоткрываем, читаем по записям. Не нашли - шлем "1,10". Исходники утеряны, пример кода не смогу привести
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Ну тут всё сводится к простому определению "типа" текстового файла для параметров драйвера.RaFaeL писал(а): ↑16 Сентябрь 2018, 20:22Исходники утеряны, пример кода не смогу привести
Т.е. Choose(InString('<13,10>' ... А хотелось бы ASCII драйвер не юзать. Совсем.
Наверно да. Где-то в чертогах разума сидит ещё, что в DOS у клавиши ENTER был код 13.vic7tar писал(а): ↑16 Сентябрь 2018, 20:10<-> наоборот.
Я вот подозревал, что всё непросто - потому и спросил ...
Если отбросить совсем футуристические варианты, то видимо действительно нужно искать перенос строки как <10>,
но но при этом убирать из строки возможный последний символ <13> и контролировать хвостик строки (конец файла).
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Работа с текстовым файлов как с строкой
Код: Выделить всё
LoadFile PROCEDURE (pName)
loc:szFile CSTRING(FILE:MaxFileName)
loc:hFile LONG
loc:dwSize UNSIGNED
loc:lpFileSizeHigh ULONG
loc:dwBytesRead ULONG
loc:bRead BOOL
loc:StrBuf &CString
loc:ok byte
CODE
loc:szFile=pName
loc:hFile = CreateFile(loc:szFile,GENERIC_READ,0,0,OPEN_EXISTING,0,0)
if loc:hFile <> INVALID_HANDLE_VALUE
loc:dwSize = GetFileSize(loc:hFile,loc:lpFileSizeHigh)
if loc:dwSize > 0
loc:StrBuf &= new(CSTRING(loc:dwSize))
loc:bRead = ReadFile(loc:hFile,ADDRESS(loc:StrBuf),SIZE(loc:StrBuf),loc:dwBytesRead,0)
loc:ok=1
end
CloseHandle(loc:hFile)
end
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Работа с текстовым файлов как с строкой
Прототипы.
Код: Выделить всё
MODULE('WINAPI')
CreateFile(*CSTRING,ULONG,ULONG,LONG,ULONG,ULONG,UNSIGNED=0),UNSIGNED,RAW,PASCAL,NAME('CreateFileA')
GetFileSize(UNSIGNED,*ULONG),ULONG,PASCAL,NAME('GetFileSize')
ReadFile(UNSIGNED,LONG,ULONG,*ULONG,LONG),BOOL,PASCAL,RAW,NAME('ReadFile')
WriteFile(UNSIGNED,<*?>,ULONG,*ULONG,<*?>),BOOL,PASCAL,RAW,PROC
CloseHandle(UNSIGNED),BOOL,PASCAL,PROC,NAME('CloseHandle')
END
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Спасибо всем, кто принял участие в обсуждении, теперь прекрасно можно
построчно обрабатывать и печатать текстовые файлы, без ASCII драйвера.
1. Считаем, что перенос строк это <13,10>;
2. Юзаем безопасный SUB, вместо индексированной строки;
3. Обрабатываемую строку не модифицируем
построчно обрабатывать и печатать текстовые файлы, без ASCII драйвера.
1. Считаем, что перенос строк это <13,10>;
2. Юзаем безопасный SUB, вместо индексированной строки;
3. Обрабатываемую строку не модифицируем
Код: Выделить всё
! xStr_ - собственно сама строка для печати
Loc:SLen Long ! Длина строки (и флаг завершения печати)
Loc:Start Long ! Позиция первого символа
Loc:CRLF Long ! Позиция символов переноса строки
Code
Loc:SLen = Len(Clip(xStr_)) ! Длина строки
Loc:Start = 1 ! Начнём с начала
Loop
Loc:CRLF = InString('<13,10>', xStr_, 1, Loc:Start) ! Найти позицию переноса
If Loc:CRLF = 0 ! Если нет переноса -> печать хвостика и выход
Loc:CRLF = Loc:SLen + 1 ! До конца файла
Loc:SLen = -1 ! Установить флаг для завершения обработки
end
PRINT( Sub(xStr_, Loc:Start, Loc:CRLF - Loc:Start) )
Loc:Start = Loc:CRLF + 2 ! Сдвиг позиции за перенос
If Loc:Start > Loc:SLen then Break. ! Если вылезли за размер строки
end
За теми кто отстал - не возвращаться. (С) Кодекс
- morkovin
- Ветеран
- Сообщения: 910
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Файл в строку:
StringTheory от CapeSoft
StringTheory от CapeSoft
Loadfile (String FileName, Long Offset=0, Long Length=0, Long RemoveBOM=false)
Description
Loads a file off the disk, and places it in the current string value. The maximum size of the file is limited only by the maximum size of a string in Clarion (which is a around two gigabytes.) The existing contents of the object are discarded before the file is loaded.
WBR, morkovin
- morkovin
- Ветеран
- Сообщения: 910
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Там же (в StringTheory) есть и парсинг CSV-файлов. Я активно это использую. Работает очень шустро. Выглядит примерно так:
Код: Выделить всё
SETCURSOR(CURSOR:Wait)
str.LoadFile('1.CSV')
str.Split('<13,10>','"')
loop x = 1 to str.Records()
Lne.SetValue(Str.GetLine(x))
Lne.Split(';','"','"',true)
klk:F = LEFT(Lne.GetLine(1)) ! первое поле в строке
klk:I = LEFT(Lne.GetLine(2)) ! второе поле
klk:O = LEFT(Lne.GetLine(3))
klk:DATEBIRTH=deformat(Lne.GetLine(4), @D06.)
klk:POL=LOWER(Lne.GetLine(5))
klk:POLIS=Lne.GetLine(6)
klk:ADRESSPROP=Lne.GetLine(7)
klk:ID_OsnObuch=1 !Lne.GetLine(8)
.... и т. д.
klk:KodPodrazd=Lne.GetLine(36)
klk:MestoRojd=Lne.GetLine(37)
klk:ADRESSDOM=Lne.GetLine(38)
IF Access:klk_abit.TryInsert()=Level:Benign THEN
CLEAR(KLK:Record)
END
END
SETCURSOR()
WBR, morkovin
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Это уже больше похоже на "ручную" обработку файла BASIC драйвером, а не ASCII.
Что кстати, тоже в моих планах есть, но следующим актом марлезонского балета …
И, кстати, т.к. BASIC драйвер построен на ASCII - то и тупит он точно также … поэтому не удивительно,
что в различных наборах шаблонов пытаются его заменить на работу со строкой в памяти.
Логично, разумно и очень эффективно (скорость обработки на больших текстовых файлов возрастает на порядок).
За теми кто отстал - не возвращаться. (С) Кодекс
- morkovin
- Ветеран
- Сообщения: 910
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Мне не приходится объявлять никакие BASIC- и ASCII-файлы в словареобработку файла BASIC драйвером, а не ASCII
WBR, morkovin
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Объявлять структуру текстовых файлов в словаре - это конечно же анахронизм, но по ходу работы программы,
в различных процедурах приходится (точнее раньше приходилось) объявлять различные текстовые файлы для обработки.
Например, дёрнуть страничку с сайта и распарсить и т.д.
Много есть задач с обработкой текстовых файлов, так или иначе ...
За теми кто отстал - не возвращаться. (С) Кодекс
- morkovin
- Ветеран
- Сообщения: 910
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Главный объект в StringTheory - это "строка" (с динамическим выделением памяти)объявлять различные текстовые файлы для обработки
Объявил нужные объекты:
st StringTheory
st1 StringTheory
....
и дальше делай с ними любые манипуляции
st.SetValue('hello world')
st.LoadFile('c:\windows\win.ini')
st.ToBlob(IniData.Text)
st1.FromBlob(IniData.Text)
myBlobContents = st1.GetValue()
и др.
WBR, morkovin
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Не вызывает сомнений. Вы описываете, как пользоваться готовым инструментом для работы со строками.
А я пытаюсь этот инструмент реализовать …
За теми кто отстал - не возвращаться. (С) Кодекс
- morkovin
- Ветеран
- Сообщения: 910
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Не опоздал?А я пытаюсь этот инструмент реализовать …
Там всё в исходных кодах. Бери и рихтуй.
WBR, morkovin
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Та в принципе, не такая уж сложная задача, на самом деле-то …
Намного интересней разобраться и сделать, чем копаться в чужих классах, где куча всего разного (и мне не нужного).
За теми кто отстал - не возвращаться. (С) Кодекс